DB

FastAPIとPostgreSQLの連携方法

PostgreSQLのインストール方法はこちらを参照

PostgreSQLと接続する方法はいくつかありますが、今回はSQLAlchemyを使ってしまいます。

後、一つ必要なのがPostgreSQLを扱うためのpsycopg2というライブラリです。

psycopg2を使うと接続情報を文字列で設定すると裏側で必要な形に変換して自動的に接続してくれます。

psycopg2-binaryというライブラリもあるので、こっちを使います。

違いは、コンパイラや外部のライブラリ等を使う場合にはpsycopg2を使用します。今回は特に凝ったことはしないので、軽量なpsycopg2-binaryを使用していきます。

まずは必要なモジュールをインストールします。FastAPIは別途インストールしておいてください。

pip install sqlalchemy psycopg2-binary

データベースに接続するためのコードを書いていきます。

database.py

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine=create_engine('postgresql://ユーザー名:パスワード@ホスト/DB名',
                     echo=True)

Base = declarative_base()

SessionLocal = sessionmaker(bind=engine)

※ポートをデフォルトから変更している場合
postgresql://ユーザー名:パスワード@ホスト:ポート/DB名

sessionmakerについて軽く触れておくとORMでは、コード側とDB側で同期する仕組みとしてセッションを用いてます。DBとフロントで差異が発生しないのに必要なものだと思ってください。

declarative_baseは、クラス定義が自動的にテーブル定義とひもづけることができます。

これからモデルを定義してテーブルを作成するわけですが、そこで使用します。

早速、モデルを作成していきます。

イメージとして商品を登録するためのテーブルを作成して見ます。

テーブル名を任意の名前で指定し、必要なカラム(id、名前、説明文、価格、申込受付)といったものを用意します。

型に関しては、SQLAlchemyが用意してくれているので必要に応じてインポートすれば問題ありません。

先程、作成したファイルからdeclarative_baseをインスタンスかしたものを読み込んでおきます。

これでテーブルを作成する準備が整いました。

models.py

from database import Base
from sqlalchemy import String, Boolean, Integer, Column,Text

class Item(Base):
    __tablename__ = 'items'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(255), nullable=False, unique=True)
    description = Column(Text)
    price = Column(Integer, nullable=False)
    on_offer = Column(Boolean, default=False)

    def __repr__(self):
        return f'<Item name={self.name} price={self.price}>'

最後に、テーブルを作成するコードを書いて実行して完成です。

create_db.py

from database import Base, engine
from models import Item

print('Creating database ...')

Base.metadata.create_all(engine)
python create_db.py

エラーなく実行できたら、pgAdminでテーブルが作成できているか確認して見てください。

ここまで出来たら、FastAPIの方でrouteを作成してCRUD操作をしてあげれば簡単なRESTAPIが作成できます。