2025-04-02雑記2 min read

【Python】SQLAlchemyとAlembicを使ったNeonDBのテーブル作成とマイグレーション手順を紹介

この記事にはPRを含みます

【Python】SQLAlchemyとAlembicを使ったNeonDBのテーブル作成とマイグレーション手順を紹介

目次

Pythonを使い、SQLAlchemyとAlembicでNeonDBにテーブル作成とマイグレーションを行った手順です

それぞれの説明

SQLAlchemy

Python向けのORM(オブジェクト関係マッパー)およびSQLツールキット

データベースとPythonコードの橋渡しをし、テーブルをPythonのクラスとして扱うことができます

Python向けとしては最も人気があるORMです

Alembic

SQLAlchemyと連携するデータベースマイグレーションツールで、スキーマの変更(テーブル追加・変更・削除など)をバージョン管理し、手軽にデータベースの更新行えます

SQLAlchemyのモデル変更を反映させるのに便利です

NeonDB

PostgreSQL互換のクラウドデータベースでサーバーレス構造を採用し、スケーラブルかつ高速な動作が特徴です

無料プランがあり個人開発するにはもってこいのデータベースです

テーブル作成とマイグレーション手順

1. ライブラリのインストール

まず、必要なライブラリをインストールします

pip install sqlalchemy alembic python-dotenv psycopg2-binary

または、requirements.txtに以下を追記してインストールします

sqlalchemy
alembic
python-dotenv
psycopg2-binary
pip install -r requirements.txt


2. Alembic 設定ファイルの作成

Alembic の設定ファイルを生成します

alembic init alembic

3. データベース接続設定

alembic.ini を編集し、sqlalchemy.url を NeonDB の接続 URL に設定します

sqlalchemy.url = postgresql://[user]:[password]@[host]:[port]/[dbname]?sslmode=require

.env ファイルに DATABASE_URL を定義している場合は、以下のように alembic.ini を設定します

sqlalchemy.url = %(DATABASE_URL)s

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

マイグレーションファイルを作成します。テーブル名とカラム構成に合わせてメッセージを修正してください

今回はpricesという名前のテーブルを作成します

alembic revision -m "create prices table"

5. マイグレーションファイルの編集

作成されたマイグレーションファイル(alembic/versions/[revision]_create_prices_table.py)を編集し、upgrade() 関数と downgrade() 関数にテーブルとカラムの定義を記述します

def upgrade() -> None:
    op.create_table(
        "prices",
        sa.Column("code", sa.VARCHAR(20), primary_key=True),
        sa.Column("price", sa.Integer),
        sa.Column("date", sa.Date),
    )


def downgrade() -> None:
    op.drop_table("prices")

6. マイグレーションの実行

マイグレーションを実行し、データベースにテーブルを作成します

alembic upgrade head

7. テーブル作成の確認

最後に作成されたテーブルを確認するために、Python コードから接続してテーブルの存在を確認します

import os
from dotenv import load_dotenv
from sqlalchemy import create_engine, text

load_dotenv()
database_url = os.environ["DATABASE_URL"]

engine = create_engine(database_url)

with engine.connect() as conn:
    result = conn.execute(text("SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'prices')"))
    table_exists = result.scalar()
    print(f"prices table exists: {table_exists}")

Neon Consoleの方でもテーブル作成されていることの確認ができました!

まとめ

簡単な手順でテーブル作成まですることができました

SQLAlchemyとAlembicは相性が良いですし、NeonDBの無料プランも個人開発レベルでは十分なのでこの構成は様々なプロジェクトで使いまわせそうです!

profile

たこやま

フリーランスエンジニアやってます