🐍

SQLAlchemy のCRUD(Create, Read, Update, Delete) 基本操作

2023/10/22に公開

SQLAlchemyを使うテーブルの基本操作を下記にまとめます。

接続するDBはAccessを使用しています。SQLserverなど別のDBを使う場合は接続部分のコードを変更して下さい。

↓ AccessとSQLServerの接続方法を紹介

https://zenn.dev/yuma_memorandum/articles/f2de7bbbc71a51

DBとの接続(Accessファイル)

from sqlalchemy import create_engine,MetaData
from sqlalchemy.orm import declarative_base

Access_path = r"test.accdb" #Accessのパス

driver = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
dbq = "DBQ={};".format(Access_path)
conn_str = (
        driver+dbq
)
engine = create_engine("access+pyodbc:///?odbc_connect=" + conn_str)

テーブルとの接続

from sqlalchemy.schema import Column
from sqlalchemy.types import Integer, String

Base = declarative_base()

#DBのテーブルをオブジェクト化する(テーブル名、各列の情報を記載する)
class User(Base):
    __tablename__ = "user"  # テーブル名
    user_id = Column(Integer, primary_key=True)
    first_name = Column(String(255))
    last_name = Column(String(255))
    age = Column(Integer)

Base.metadata.create_all(engine) #Baseを継承するテーブル群が一括で作成される

from sqlalchemy.orm import sessionmaker

SessionClass = sessionmaker(engine)  # セッションを作るクラスを作成
session = SessionClass()

テーブルが既に存在する場合は、テーブル名を指定することで列情報をそのまま取得できる

from sqlalchemy import create_engine, MetaData,Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

#モデルクラスの作成
Base = declarative_base()

meta = MetaData()
meta.reflect(bind=engine)  # metadataを取得
Base = declarative_base(metadata=meta)

class User2(Base):  # クラス名は何でもok
    __tablename__ = "user" #Userテーブルを指定
    __table_args__ = {"autoload": True} #テーブルの列情報を取得

###User2の列情報を自動で取得できる
#user_id = Column(Integer, primary_key=True)
#first_name = Column(String(255))
#last_name = Column(String(255))
#age = Column(Integer)

Base.metadata.create_all(engine) #Baseを継承するテーブル群が一括で作成される

SessionClass = sessionmaker(engine)  # セッションを作るクラスを作成
session = SessionClass()

Insert文

#insert
user = User(first_name="first_a", last_name="last_a", age=20) 
session.add(user) 
session.commit() #テーブルに反映

Select文

#select
users = session.query(User).all()  # userテーブルの全レコードをクラスが入った配列で返す
user = session.query(User).first()  # userテーブルの最初のレコードをクラスで返す
print(user.first_name) # 最初のレコードのfirst_name列のデータを出力する

Update文

#update
user = session.query(User). \
    filter(User.first_name == "first_a"). \
    first()
user.first_name = "b"
session.commit()

Delete文

#delete
session.query(User). \
    filter(User.age > 10).delete()
session.commit()

Discussion