pythonをデータベースするためにsqlalchemyでDBに接続する①
はじめに
- 表題の件を下記の公式サイトを参考に実装してみる
公式サイトではSQLAlchemyを使用した例があるのでSQLAlchemyを利用したデータベースアクセスを実装してみる。 fastapi.tiangolo.com
下記のデータベースをサポートしている PostgreSQL MySQL SQLite オラクル Microsoft SQLServerなど。
mysqlclient(MySQL-Pythonの維持されたフォーク)ドライバーを介したMySQLデータベースのアクセスをおこなうため、mysqlclientも利用する。 docs.sqlalchemy.org
DB接続方法
from sqlalchemy import create_engine
#DB = create_engine('mysql://<DBユーザー>:<DBユーザーのパスワード>@<データベースサーバー>:<DBのポート>/<DB名>',encoding="utf-8",echo=True)
DB = create_engine('mysql://root:passwod@db:3306/fastapi',encoding="utf-8",echo=True)
セッションの作成
- セッションを利用する理由は、SQLAlchemyORMを利用するために必要な抽象化の上位層を提供します。Sessionは、変更されたモデルのグラフを維持し、必要に応じて変更が効率的かつ一貫してデータベースにフラッシュされるようにします。
参考文献 stackoverflow.com
- 下記のコードでセッションを作成する
from sqlalchemy.orm import sessionmaker, scoped_session
session = scoped_session(
sessionmaker(
autocommit=True,
autoflush=False,
expire_on_commit=False,
bind=ENGINE
)
)
宣言型クラス定義
- SQLAlchemyの宣言型拡張は、SQLAlchemyを使用する最新の方法です。Djangoの動作と同様に、テーブルとモデルを一度に定義できます。次のテキストに加えて、宣言型拡張に関する公式ドキュメントをお勧めします。
from sqlalchemy.ext.declarative import declarative_base # modelを使用する Base = declarative_base() # DB接続用のセッションクラス、インスタンスが作成されると接続する Base.query = session.query_property()
全体的なDB接続部分のロジック
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
ENGINE = create_engine('mysql://root:password@db:3306/fastapi',encoding="utf-8",echo=True)
session = scoped_session(
sessionmaker(
autocommit=True,
autoflush=False,
expire_on_commit=False,
bind=ENGINE
)
)
# modelで使用する
Base = declarative_base()
# DB接続用のセッションクラス、インスタンスが作成されると接続する
Base.query = session.query_property()