フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

pythonをデータベースするためにsqlalchemyでDBに接続する①

はじめに

  • 表題の件を下記の公式サイトを参考に実装してみる
  • 公式サイトではSQLAlchemyを使用した例があるのでSQLAlchemyを利用したデータベースアクセスを実装してみる。 fastapi.tiangolo.com

  • 下記のデータベースをサポートしている PostgreSQL MySQL SQLite オラクMicrosoft SQLServerなど。

  • mysqlclient(MySQL-Pythonの維持されたフォーク)ドライバーを介したMySQLデータベースのアクセスをおこなうため、mysqlclientも利用する。 docs.sqlalchemy.org

DB接続方法

docs.sqlalchemy.org

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は、変更されたモデルのグラフを維持し、必要に応じて変更が効率的かつ一貫してデータベースにフラッシュされるようにします。

docs.sqlalchemy.org

参考文献 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の動作と同様に、テーブルとモデルを一度に定義できます。次のテキストに加えて、宣言型拡張に関する公式ドキュメントをお勧めします。

flask.palletsprojects.com

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()