📑

FastAPIとPostgreSQLの結合:モデル定義とマイグレーション入門

2023/09/30に公開

1. はじめに

1.1 自己紹介と注意事項

初めまして。私はプログラミング初心者で、これが初めての記事となります。学びながら記述しているため、全ての情報が正確で最新であるとは保証できませんので、公式ドキュメントも併せて参照し、随時確認して開発を進めてください。また、不明点や疑問点が生じた際には、積極的に調べ、学び深めていただければと思います。

1.2 記事の目的と対象読者

この記事は、FastAPIとPostgreSQLを連携させることに焦点を当てた入門ガイドです。PipenvとDockerを使用して環境を構築し、Alembicでデータベースマイグレーションを行います。初心者の開発者を対象にしています。

1.3 FastAPIとPostgreSQLの簡単な紹介

  • FastAPI
    FastAPIは、高性能なWebフレームワークであり、Pythonの型ヒントを利用しています。

  • PostgreSQL
    PostgreSQLは、拡張性と信頼性に優れたオープンソースのリレーショナルデータベース管理システムです。

1.4 連携の重要性と本記事の焦点

FastAPIとPostgreSQLを組み合わせることで、効果的かつ拡張性のあるバックエンドシステムの構築が可能になります。この記事では、データモデルの作り方、データベースの更新方法(マイグレーション)、そしてこれらの要素がどのように連携するのかについて、分かりやすくご紹介します。

2. 開発環境のセットアップ

2.1 必要なツール・ソフトウェアのリストアップ

  • Python(バージョン3.7以上)
  • FastAPI
  • PostgreSQL(Dockerコンテナ)
  • Uvicorn(ASGIサーバ)
  • SQLAlchemy(ORM)
  • Pipenv
  • Docker
  • Alembic(マイグレーションツール)
  • DBeaver(データベース管理ツール)

2.2 事前インストール手順

PythonとPipenvのインストール

公式サイトからPythonをダウンロードし、インストーラを使用してインストールします。次に、Pipenvをインストールします。

pip install pipenv

Dockerのインストール

Docker Desktopを公式サイトからダウンロードし、インストーラを使用してDockerをインストールします。

3. プロジェクト構成のセットアップ

このセクションでは、基本的なプロジェクト構成のセットアップを行い、FastAPIが正しく起動できることを確認します。

3.1 プロジェクトフォルダの作成

まず、プロジェクトを格納するためのメインフォルダを作成します。ここでは、そのメインフォルダの名前をmy_projectとします。次に、my_projectの中にbackendという名前のフォルダを作成します。最後に、backendフォルダの中にappという名前のフォルダを作成します。

以下は、コマンドラインでのフォルダ作成のコマンドです。

mkdir my_project
cd my_project
mkdir backend
cd backend
mkdir app

3.2 仮想環境のセットアップとパッケージのインストール

backendフォルダ直下で、pipenvを使用して仮想環境をセットアップします。

pipenv --python 3.11

このコマンドを実行すると、backend直下にPipfileが生成されます。このPipfileを開くと、以下のような内容が記載されていることを確認できます。

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.11"
python_full_version = "3.11.3"

次に、必要なパッケージをインストールします。

pipenv install fastapi uvicorn

このコマンドを実行すると、packagesセクションにインストールしたパッケージが追加されます。

ワンポイント:`pipenv install -d`の利用

pipenv install-dオプションを付けると、開発時にのみ必要なパッケージをdev-packagesセクションにインストールできます。例えば、テストツールやリントツールなど、本番環境では不要なパッケージをインストールする際に便利です。

pipenv install -d pytest flake8

3.3 FastAPIアプリケーションの作成

appフォルダの中に、main.py__init__.pyいう名前のPythonファイルを作成します。main.pyファイルに、最も基本的なFastAPIアプリケーションのコードを記述します。
__init__.pyは、空のファイルで、Pythonにこのディレクトリをパッケージとして認識させるために必要です。

main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

3.4 FastAPIアプリケーションの起動

コマンドラインを開き、appフォルダがあるbackendフォルダまで移動します。次に、Pipfileにスクリプトを追加して、pipenvの仮想環境内でFastAPIアプリケーションを簡単に起動できるようにします。Pipfileに以下の[scripts]セクションを追加してください。

[scripts]
start = "uvicorn app.main:app --reload"

追加したら、以下のコマンドでFastAPIアプリケーションを起動できます。

pipenv run start
ワンポイント:`uvicorn`コマンドの解説
  • uvicornは、ASGIサーバーです。FastAPIアプリケーションをホストするために使用します。
  • app.main:appは、appモジュール(main.pyファイル)内のappインスタンスを指します。これにより、Uvicornはどのアプリケーションオブジェクトを実行するか知ることができます。
  • --reloadオプションは、開発中にコードの変更を自動的に反映させるためのオプションです。このオプションがあると、コードを変更するたびにサーバーを再起動する必要がなくなります。

以上の設定を行った後、ブラウザでhttp://127.0.0.1:8000にアクセスして、"Hello, World!"が表示されれば、FastAPIが正しく起動していることが確認できます。

4. Dockerを使用してPostgreSQLコンテナのセットアップ

このセクションでは、Dockerdocker-composeを使用して、PostgreSQLデータベースのコンテナをセットアップします。backendフォルダ直下にdocker-compose.ymlファイルを作成し、以下の内容を記述します。

version: '3.9'
services:
  db:
    image: postgres:15
    volumes:
     - ./app/db/postgresql/data:/var/lib/postgresql/data
      - ./app/db/postgres:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --locale=C

4.1 docker-compose.ymlの解説

version

このフィールドでは、使用するdocker-composeのバージョンを定義します。ここでは3.9を使用しています。

services

このフィールドでは、定義する各サービス(コンテナ)をリストアップします。今回はdbサービス(コンテナ)をセットアップします。このdbは、docker-compose内でのこのサービスの識別名として機能します。

この名前の変更により、コンテナを操作する際のコマンドも少し変わります。例えば、このコンテナのログを確認するには、以下のコマンドを使用します。

docker-compose logs db

image

このフィールドで、dbコンテナで使用するDockerイメージを指定します。postgres:15は、PostgreSQLのバージョン15のイメージを使用することを意味します。

volumes

このフィールドで、コンテナ内のディレクトリをホストのディレクトリと紐付け(マウント)します。これにより、コンテナ内のデータをホストマシン上で永続化できます。

    volumes:
      - ./app/db/postgresql/data:/var/lib/postgresql/data
      - ./app/db/postgres:/docker-entrypoint-initdb.d

上記の設定により、PostgreSQLのデータが./app/db/postgresql/dataディレクトリに永続化されます。これにより、コンテナを削除または再作成しても、データベースのデータは保持されます。また、コンテナ内の/docker-entrypoint-initdb.dディレクトリは./app/db/postgresディレクトリにマウントされます。

ports

コンテナのポートをホストのポートにマッピングします。"5432:5432"とすることで、コンテナの5432ポートがホストの5432ポートに結びつけられます。

environment

環境変数を定義します。ここで定義した環境変数は、コンテナ内で利用可能となります。特に、ここではPostgreSQLの設定に関わるいくつかの重要な環境変数を設定しています。

環境変数の詳細

💡 POSTGRES_USER
この環境変数は、PostgreSQLのスーパーユーザーのユーザ名を設定します。デフォルトはpostgresです。

💡 POSTGRES_PASSWORD
この環境変数は、スーパーユーザーのパスワードを設定します。セキュリティの観点から、この環境変数の設定は強く推奨されます。設定しない場合、パスワードなしでアクセス可能になります。

💡 POSTGRES_INITDB_ARGS
この環境変数は、データベース初期化時の引数を設定します。デフォルトの設定が適用されますが、ここではエンコーディングをUTF-8にし、ロケールをCに設定しています。これにより、データベースの文字エンコーディングの問題を防ぎます。

4.2 コンテナの起動とデータの永続化の確認

backendフォルダ直下で、以下のコマンドを実行し、コンテナを起動します。

docker-compose up

このコマンドを実行することで、定義したdocker-compose.ymlに基づいてPostgreSQLコンテナが起動します。コンテナが正しく起動したことを確認したら、volumesで設定した箇所にフォルダが作成されているかを確認しましょう。

ls ./app/db/postgresql/data
ls ./app/db/postgres

これらのコマンドを実行することで、指定したディレクトリが正しく作成されているか確認できます。初回の起動時にのみ、これらのディレクトリは作成されますので、この時点でしっかりと確認しておくことが重要です。

このディレクトリの確認により、データの永続化が正しく行われていることがわかります。これによって、コンテナを再起動したり、削除したりしても、データベースのデータは保持され続けます。

5. モデルの設定とORMの利用

このセクションでは、データベースにテーブルを作成するためのモデルをセットアップします。モデルは、データベースのテーブルの構造をPythonのクラスで表現したものです。また、このモデルを通じて、ORM(Object-Relational Mapping)の概念を利用します。ORMは、プログラミング言語のオブジェクトとデーキースのテーブルをマッピングするテクニックです。これにより、データベース操作をプログラムのオブジェクトとして扱えるため、データベースとのやり取りが直感的かつ容易になります。

5.1 Baseクラスの作成

まず、app/dbディレクトリ内に既に存在しているため、その中に__init__.pybase_class.pyという名前のファイルを作成します。__init__.pyは空のファイルで、Pythonにこのディレクトリをパッケージとして認識させるために必要です。

次に、base_class.pyに以下のコードを記述します。

base_class.py
from typing import Any
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.orm import as_declarative

@as_declarative()
class Base:
    id: Any
    __name__: str

    # Generate __tablename__ automatically
    @declared_attr
    def __tablename__(cls) -> str:
        return cls.__name__.lower()

このBaseクラスは、他のモデルクラスが継承する基底クラスとなります。このクラスを継承することで、作成するモデルクラスはSQLAlchemyの機能にアクセスでき、データベースとのインタラクションが可能になります。__tablename__メソッドを利用して、継承したクラスのインスタンスがデータベースにマッピングされる際のテーブル名を自動生成します。

5.2 Userモデルの作成

次に、appディレクトリ内にmodelsディレクトリを新規作成します。そして、その中に__init__.pyuser.pyという名前のファイルを新規作成します。__init__.pyは、ここでも空のファイルで、Pythonにこのディレクトリをパッケージとして認識させるために必要です。

次に、user.pyに以下のコードを記述します。

user.py
from datetime import datetime
from app.db.base_class import Base
from sqlalchemy import Column, DateTime, String

class User(Base):
    __tablename__ = "users"
    id = Column(String, primary_key=True)
    name = Column(String(20), nullable=False, default="default_name")
    created_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

ここで定義したUserクラスは、Baseクラスを継承しており、データベースのusersテーブルに対応するモデルとなります。このモデルクラスを通じて、データベースにデータを保存したり、データベースからデータを取得したりできます。

コードの詳細説明:

  • __tablename__ = "users": このクラスがデータベース内でどのテーブルに対応するかを指定しています。ここではusersテーブルと定義しています。
  • id = Column(String, primary_key=True): usersテーブルにはidという名前のカラムが存在し、これがテーブルの主キーとなります。主キーは、テーブル内の各行を一意に識別するためのキーです。
  • name = Column(String(20), nullable=False, default="default_name"): この行は、nameという名前のカラムを定義しています。nullable=Falseはこのカラムが空の値を許さないことを意味し、default="default_name"は、何も値が設定されなかった場合にはdefault_nameがデフォルト値として設定されることを意味します。
  • created_at および updated_at カラム: これらは、ユーザーが作成された日時や更新された日時を保持します。default=datetime.utcnowは、デフォルトで現在のUTC時刻が設定され、onupdate=datetime.utcnowは、行が更新されるたびに現在のUTC時刻で更新されます。

このセクションでは一つのテーブルのみを作成しましたが、実際には複数のテーブルを作成し、それらの間でのリレーションシップも設定できます。これにより、複雑なデータ構造とデータ間の関係を表現し、データベースからのデータ取得や操作がより効率的に行えます。

6. FastAPIとデータベースの接続設定

このセクションでは、FastAPIアプリケーションとPostgreSQLデータベースを接続する設定を行います。これにより、アプリケーションからデータベースにアクセスし、データの読み書きができるようになります。

6.1 必要なパッケージのインストール

まず、以下のコマンドを実行して、必要なパッケージをインストールしてください。

pipenv install pydantic-settings psycopg2-binary
  • pydantic-settingsは、BaseSettingsを使うために必要なパッケージです。
  • psycopg2-binaryは、PythonからPostgreSQLに接続するためのパッケージです。

6.2 設定ファイルの作成

次に、appディレクトリの中にcoreディレクトリを新しく作成し、その中に__init__.pyconfig.pyという名前のファイルを作成します。__init__.pyは空のファイルで構いません。これにより、Pythonはこのディレクトリをパッケージとして認識します。

6.3 config.pyの記述

config.pyではpydantic-settingsBaseSettingsクラスを利用します。このBaseSettingsクラスを利用すると、環境変数や.envファイルから設定値を簡単に読み込むことができます。
config.pyに以下のコードを記述します。

config.py
import enum
from typing import Any, Optional

from pydantic import PostgresDsn, ValidationInfo, field_validator
from pydantic_settings import BaseSettings


class AppEnvironment(str, enum.Enum):
    DEVELOP = "development"
    PRODUCTION = "production"


class Settings(BaseSettings):
    ENVIRONMENT: AppEnvironment

    API_V1_STR: str = "/api/v1"
    PROJECT_NAME: str = "My_Project_Name"

    POSTGRES_SERVER: str
    POSTGRES_USER: str
    POSTGRES_PASSWORD: str
    POSTGRES_DB: str
    POSTGRES_PORT: str
    SQLALCHEMY_DATABASE_URI: Optional[str] = None

    @field_validator("SQLALCHEMY_DATABASE_URI", mode="after")
    def assemble_db_connection(cls, v: Optional[str], values: ValidationInfo) -> Any:
        if isinstance(v, str):
            return v
        
        return str(
            PostgresDsn.build(
                scheme="postgresql",
                username=values.data.get("POSTGRES_USER"),
                password=values.data.get("POSTGRES_PASSWORD"),
                host=values.data.get("POSTGRES_SERVER"),
                port=int(values.data.get("POSTGRES_PORT")),
                path=f"{values.data.get('POSTGRES_DB') or ''}",
            )
        )


settings = Settings()

6.4 .envファイルの作成

次に、プロジェクトのbackendディレクトリ直下に.envという名前のファイルを作成します。そして、以下の内容を.envファイルに記述します。

ENVIRONMENT='development' 

POSTGRES_USER='postgres'
POSTGRES_PASSWORD='postgres'
POSTGRES_DB='postgres'
POSTGRES_SERVER='localhost'
POSTGRES_PORT='5432'

6.5 データベースへの接続

次に、SQLAlchemyを使用してデータベースへ接続を試みます。appディレクトリ内にsession.pyという名前のファイルを作成し、以下の内容を記述します。

session.py
from app.core.config import settings
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker

if settings.SQLALCHEMY_DATABASE_URI:
    engine = create_engine(
        settings.SQLALCHEMY_DATABASE_URI,
        pool_pre_ping=True,
    )
    SessionLocal = scoped_session(
        sessionmaker(autocommit=False, autoflush=False, bind=engine)
    )

    if settings.ENVIRONMENT == "development":
        db_info = f"Using database at {settings.SQLALCHEMY_DATABASE_URI}"
        print(db_info)
else:
    raise ValueError("SQLALCHEMY_DATABASE_URI is not set")

このファイルでは、設定ファイルからデータベースのURLを取得し、SQLAlchemyのcreate_engine関数を使用してデータベースへの接続エンジンを作成しています。また、sessionmakerを使用して、デーキースセッションのファクトリSessionLocalを作成しています。

6.6 接続のテスト

最後に、作成した接続設定が正しく動作するかテストします。appディレクトリ内にtest_connection.pyという名前のファイルを作成し、以下の内容を記述します。

test_connection.py
from sqlalchemy import text
from app.db.session import engine

with engine.connect() as connection:
    result = connection.execute(text("SELECT 'Hello, World!'"))
    print(result.scalar())

このスクリプトを実行すると、データベースに接続し、簡単なSQL文を実行して結果を出力します。これにより、設定が正しく、データベースに接続できることを確認できます。

pipenv run python -m app.test_connection

このコマンドを実行し、"Hello, World!"が出力されれば、データベースへの接続設定が正しく完了しています。

7. データベースマイグレーションの設定

データベースマイグレーションとは、データベースのスキーマを変更するプロセスです。例えば、新しいテーブルの追加や既存のテーブルの変更などが含まれます。このセクションでは、Alembicというツールを使用して、データベースマイグレーションを管理します。

Alembicとは?

Alembicは、SQLAlchemyで使用するための軽量データベースマイグレーションツールです。Alembicを用いると、データベーススキーマの変更履歴を一元的に管理できます。このツールの利点としては以下のような点が挙げられます。

  • バージョン管理: データベースの変更履歴をコードベースに保持でき、バージョン管理システムを通じてスキーマの変更を追跡できます。
  • 環境の一致: 開発、テスト、本番環境間でデータベースのスキーマを一致させることができ、環境間での不整合によるバグを防ぐことができます。
  • ロールバック機能: 過去のマイグレーションにロールバックすることができ、新しいスキーマが問題を引き起こした場合に、迅速に対処できます。

これらのメリットにより、Alembicはデータベースマイグレーションの管理において非常に効果的なツールです。

7.1 Alembicのインストール

まず、Alembicをインストールします。

pipenv install alembic

7.2 Alembicの初期設定

Alembicをインストールしたら、次のコマンドでAlembicの初期設定を行います。

pipenv run alembic init migration

このコマンドを実行すると、プロジェクトディレクトリにalembic.iniファイルとmigrationディレクトリが生成されます。

7.3 alembic.iniとenv.pyの設定

alembic.iniファイルとmigration/env.pyファイルに、プロジェクトのデータベース設定を反映させます。

  1. alembic.iniの設定
    alembic.iniにおいては、sqlalchemy.urlの値を%(DB_URL)sに設定します。

    sqlalchemy.url = %(DB_URL)s
    
  2. env.pyの設定
    migration/env.pyファイルを開き、以下の変更を加えます。

    • 必要なモジュールをインポートし、configオブジェクトを取得。
    • モデルのメタデータをインポートし、target_metadataに割り当て。
    • config.set_section_optionDB_URLを動的に設定。
    env.py
    from logging.config import fileConfig
    from sqlalchemy import engine_from_config
    from sqlalchemy import pool
    from app.core.config import settings
    from app.db.base_class import Base
    from alembic import context
    
    config = context.config
    if config.config_file_name is not None:
        fileConfig(config.config_file_name)
    
    from app.models.user import User # noqa
    from app.models.closet import Closet # noqa
    from app.models.clothes import Clothes # noqa
    target_metadata = Base.metadata
    
    config.set_section_option("alembic", "DB_URL", settings.SQLALCHEMY_DATABASE_URI)
    

    これで、Alembicを使用してデータベースマイグレーションを管理するための基本的な設定は完了です。この設定により、異なる環境間でデータベースのスキーマの一致性を保ち、スキーマの変更履歴を追跡できるようになります。

    env.pyの完全なコード
    env.py
    from logging.config import fileConfig
    
     from sqlalchemy import engine_from_config
     from sqlalchemy import pool
     from app.core.config import settings
     from app.db.base_class import Base
    
     from alembic import context
    
     # this is the Alembic Config object, which provides
     # access to the values within the .ini file in use.
     config = context.config
    
     # Interpret the config file for Python logging.
     # This line sets up loggers basically.
     if config.config_file_name is not None:
         fileConfig(config.config_file_name)
    
     # add your model's MetaData object here
     # for 'autogenerate' support
     # from myapp import mymodel
     # target_metadata = mymodel.Base.metadata
     from app.models.user import User # noqa
     target_metadata = Base.metadata
    
     # other values from the config, defined by the needs of env.py,
     # can be acquired:
     # my_important_option = config.get_main_option("my_important_option")
     # ... etc.
     config.set_section_option("alembic", "DB_URL", settings.SQLALCHEMY_DATABASE_URI)
    
     def run_migrations_offline() -> None:
         """Run migrations in 'offline' mode.
    
         This configures the context with just a URL
         and not an Engine, though an Engine is acceptable
         here as well.  By skipping the Engine creation
         we don't even need a DBAPI to be available.
    
         Calls to context.execute() here emit the given string to the
         script output.
    
         """
         url = config.get_main_option("sqlalchemy.url")
         context.configure(
     	url=url,
     	target_metadata=target_metadata,
     	literal_binds=True,
     	dialect_opts={"paramstyle": "named"},
         )
    
         with context.begin_transaction():
     	context.run_migrations()
    
    
     def run_migrations_online() -> None:
         """Run migrations in 'online' mode.
    
         In this scenario we need to create an Engine
         and associate a connection with the context.
    
         """
         connectable = engine_from_config(
     	config.get_section(config.config_ini_section, {}),
     	prefix="sqlalchemy.",
     	poolclass=pool.NullPool,
         )
    
         with connectable.connect() as connection:
     	context.configure(
     	    connection=connection, target_metadata=target_metadata
     	)
    
     	with context.begin_transaction():
     	    context.run_migrations()
    
    
     if context.is_offline_mode():
         run_migrations_offline()
     else:
         run_migrations_online()
    
    

7.4 マイグレーションファイルの作成とマイグレーションの実行

マイグレーションファイルの作成

マイグレーションファイルは、データベースの変更を記述したPythonファイルです。以下のコマンドを実行することで、マイグレーションファイルが自動生成されます。

pipenv run alembic revision --autogenerate -m "description_of_your_change"

ここで、-mオプションはマイグレーションファイルにメッセージを追加するためのオプションです。これによって、マイグレーションファイルにどのような変更が含まれているのか簡単に識別できます。このオプションを省略した場合、マイグレーションファイル名にはユニークなIDのみが含まれ、そのマイグレーションが何をするものなのかが一見してわかりにくくなります。

例えば、ユーザーテーブルを追加するマイグレーションを作成する場合、以下のように実行することができます。

pipenv run alembic revision --autogenerate -m "add_user_table"

これにより、migrations/versions ディレクトリの下に新しいマイグレーションファイルが生成されます。

マイグレーションの実行

マイグレーションファイルが作成されたら、次にそのマイグレーションを実行してデータベースに変更を適用します。マイグレーションを実行するには、以下のコマンドを使用します。

pipenv run alembic upgrade head

ただし、頻繁にマイグレーションを行う場合、毎回完全なコマンドを入力するのは煩わしいでしょう。そこで、先ほどと同様にPipfileの[scripts]セクションに以下のような記述を追加してください。

[scripts]
upgrade = "alembic upgrade head"

この設定を行った後は、マイグレーションを実行する際に以下のように短縮形のコマンドを使用できます。

pipenv run upgrade

headは、最新のマイグレーションを指します。この短縮コマンドを実行することで、作成されたマイグレーションファイルに基づいてデータベースのスキーマが更新されます。

7.5 マイグレーションの確認(DBeaverを使用)

マイグレーションが正しく適用されたか確認するために、DBeaverというデータベース管理ツールを使用します。DBeaverは、多くのデータベースシステムをサポートする無料のデータベースツールです。DBeaverを使用することで、GUIを通じて簡単にデータベースの構造を確認し、SQLクエリを実行できます。

1. DBeaverのインストール

DBeaverは多くのプラットフォームで利用可能です。以下は、DBeaver Community Edition(無料版)のインストール手順です。

  • WindowsやMac:
    1. DBeaverの公式サイトからインストーラをダウンロードします。
    2. ダウンロードしたインストーラを実行し、指示に従ってインストールを完了させます。

2. データベースへの接続

  1. DBeaverを開き、「New Database Connection」をクリックします。
  2. 接続したいデータベースのタイプを選択し(この場合はPostgreSQL)、接続設定を行います。ここで、.envファイルに設定したデータベースの情報(ユーザー名、パスワードなど)を入力します。
  3. 接続設定画面で、「Show all databases」のオプションにチェックを入れます。
  4. 「Test Connection」をクリックして接続をテストし、問題がなければ「Finish」をクリックして接続を完了させます。

3. テーブルの確認

  • DBeaverのデータベースエクスプローラを使用して、マイグレーションによって変更されたはずのテーブルを探し、構造が期待通りに変更されているか確認します。
show_all_databasesについて

DBeaverの「Show all databases」オプションをチェックすると、接続しているデータベースサーバー上のすべてのデータベースが表示されます。このオプションが無効の場合、特定のデータベースのみが表示され、他のデータベースは表示されない可能性があります。このオプションを有効にすることで、データベースサーバー上のすべてのデータベースを確認でき、マネージメントやデバッグの作業が容易になります。

8. まとめ

このシリーズでは、FastAPIを使用したWebアプリケーションの基本的な構築方法について学びました。以下は、これまでに学習した主要なトピックです。

  1. プロジェクトのセットアップ: FastAPIプロジェクトの基本的な構造とセットアップ方法を学びました。
  2. Dockerの使用: アプリケーションとデータベースのコンテナ化にDockerを使用しました。
  3. データベースの設定: PostgreSQLデータベースの設定と、FastAPIアプリケーションとの接続方法を学びました。
  4. Alembicを使用したマイグレーション: データベーススキーマの変更管理のためにAlembicを設定し、マイグレーションを実行しました。
  5. DBeaverの設定: DBeaverを使用してデータベースを視覚的に確認しました。

次のステップ

次の記事では、更に進んだ内容に触れていきます。具体的には、以下のトピックスについて詳細に説明します。

  1. 複数モデルの管理: 複数のモデルが存在し、それらのモデル間にリレーションシップがある場合の管理方法について学びます。
  2. データベース操作の実装: FastAPIを使用してデータベースにレコードを追加、更新、削除、取得する方法について詳しく説明します。

下記のリンクから続けて学習してみましょう!!
https://zenn.dev/azuki9140/articles/57b09f00e586d7

さらなる学習

これまでに学んだ知識を基に、自身でアプリケーションを開発し、新しい機能を追加することで、FastAPIとデータベース操作の理解を深めていきましょう。次の記事でも更に多くの知識とテクニックを学ぶことで、更に洗練されたアプリケーションの開発が可能になります。

このシリーズが、FastAPIを使用したWebアプリケーション開発の第一歩となり、読者の皆様の学習の助けとなることを願っています。

プロジェクトリポジトリ

今回作成したリポジトリ:
https://github.com/AzuKi9140/fastapi-postgresql-starter.git

  • 本記事で構築したプロジェクトの全てのコードが含まれています。是非、クローンまたはフォークして、自由に使用や改変を行ってください。

9. 参照リンク

参考にしたリポジトリ:
https://github.com/tiangolo/full-stack-fastapi-postgresql.git

  • 本記事を書くにあたり、参考にしたリポジトリです。詳細な例や、更に進んだ内容を学ぶには、このリポジトリが非常に有用です。

最後に

記事を読んでいただきありがとうございました。何か質問やフィードバックがあれば、お気軽にコメントしてください。

Discussion