はじめに
- 表題の件を下記の公式サイトを参考に実装してみる
公式サイトでは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()