SQLAlchemyの使用例.

インストール

pipからのインストールは次のようにして行う.

pip install SQLAlchemy

エンジン

接続情報を与える.
次はPostgreSQLに5432ポートで接続する情報の記述例.

from sqlalchemy import create_engine

dialect = "postgresql"
username = "USERNAME"
password = "PASSWORD"
database = "DATABASE"
host = "HOST"
port = "5432"
engine = create_engine(f"{dialect}://{username}:{password}@{host}:{port}/{database}")

セッション

エンジンからセッションを作成する.
withでセッションを使っている間にエラーが生じなければコミット,生じたらロールバックするつもりで予め準備しておく.

from sqlalchemy.orm import sessionmaker
from contextlib import contextmanager

SessionMkr = sessionmaker(engine)

@contextmanager
def Session():
session = SessionMkr()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()

テーブル

データベース処理用のクラスを作って,それを継承する.
ここではBooksというクラスを作り,データベースのbooksというテーブルにアクセスするようにした.
テーブル内の列はColumnで定義する.

from sqlalchemy.orm import declarative_base
from sqlalchemy.schema import Column
from sqlalchemy.types import Boolean, Integer, String, Text

Base = declarative_base()

class Books(Base):
__tablename__ = "books"
id = Column(String(7), primary_key=True)
price = Column(Integer)
title = Column(Text)
flag = Column(Boolean)

ここで主キー制約を与えるのにprimary_keyを使用した.
非Null制約にはnullable,一意制約にはuniqueを使う.

追加(SQLのINSERT)

追加したいレコードのインスタンスを作る.

book = Books()
book.id = 'dummyid'
book.title = 'testtitle'

データベースに接続してaddする.

with Session() as session:
session.add(book)

抽出(SQLのSELECT)

レコードの選択をqueryで行い,絞り込んだ上でall等により抽出する.
ここで,filterはSQLのWHERE句に相当する.

セッション.query(取り出したいもの).filter(絞り込み条件).all()

次の例では,1000円以上の書籍の品番と名前を抽出する.

with Session() as session:
data = session.query(Books.id, Books.title).filter(Books.price >= 1000).all()

更新(SQLのUPDATE)

dataに格納したレコードの更新は次のように行う.
次の例では,抽出したレコードについてflag列をTrueに更新する.

with Session() as session:
data = session.query(Books).filter(Books.id == 'A123').first()
data.flag = True

削除(SQLのDELETE)

deleteで削除が実行できる.

with Session() as session:
session.query(Books).filter(Books.id == 'A123').delete()