🐍
SQLAlchemy のCRUD(Create, Read, Update, Delete) 基本操作
SQLAlchemyを使うテーブルの基本操作を下記にまとめます。
接続するDBはAccessを使用しています。SQLserverなど別のDBを使う場合は接続部分のコードを変更して下さい。
↓ AccessとSQLServerの接続方法を紹介
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