データベーススキーマの変更も怖くない! Alembicで安全かつスムーズなマイグレーションを実現
SQLAlchemy + Alembic: スキーマ移行の作成
SQLAlchemyとAlembicは、PythonでWebアプリケーション開発においてよく使用されるライブラリです。SQLAlchemyは、オブジェクト関係マッピング(ORM)を使用して、データベースとのやり取りを簡素化します。Alembicは、データベーススキーマの変更を管理および自動化するためのツールです。
このチュートリアルでは、SQLAlchemyとAlembicを使用して、データベーススキーマの移行を作成する方法を説明します。
前提知識
このチュートリアルを理解するには、以下の知識が必要です。
- Python
- 基本的なSQL
- SQLAlchemyの基本的な概念
手順
-
プロジェクトの初期化
まず、プロジェクトに必要なライブラリをインストールする必要があります。
pip install sqlalchemy alembic flask-migrate
-
Alembicを使用して、スキーマの移行を管理するためのリポジトリを作成します。
alembic init
このコマンドを実行すると、
migrations
というディレクトリが作成されます。このディレクトリには、すべてのスキーマ移行ファイルが格納されます。 -
最初の移行ファイルを作成するには、以下のコマンドを実行します。
alembic revision --message "Initial migration"
このコマンドを実行すると、
migrations
ディレクトリに新しいファイルが作成されます。このファイルには、現在のスキーマの状態と、新しいスキーマの状態との違いを記述する Python コードが含まれています。 -
スキーマを変更するには、
models.py
ファイルで SQLAlchemy モデルを編集します。モデルを編集したら、Alembicにスキーマの変更を検出させる必要があります。alembic upgrade head
このコマンドを実行すると、Alembicはデータベースに最新のスキーマを適用します。
補足
- Alembicには、スキーマの変更を元に戻すためのコマンドも用意されています。
- Alembicは、より複雑なスキーマ移行を処理するために使用できる多くの機能を提供しています。詳細については、Alembicのドキュメントを参照してください。
例
以下の例は、シンプルなユーザーテーブルを作成し、その後そのテーブルに新しい列を追加する方法を示しています。
models.py
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(255))
# 新しい列を追加
email = Column(String(255))
alembic/versions/2024_05_23_145100_add_email_column.py
import sqlalchemy as sa
from alembic import op
# 既存のテーブルを変更
op.add_column('users', sa.Column('email', sa.String(255)))
実行
alembic upgrade head
このチュートリアルは、SQLAlchemyとAlembicを使用してスキーマ移行を作成する方法の簡単な概要を提供しています。詳細については、上記のドキュメントを参照してください。
SQLAlchemy + Alembic: スキーマ移行の作成 - サンプルコード
必要なもの
- Python 3.6以降
- SQLAlchemy
- Alembic
- Flask
-
プロジェクトのセットアップ
まず、必要なライブラリをインストールします。
pip install flask sqlalchemy alembic flask-migrate
次に、プロジェクトディレクトリを作成し、以下のコマンドを実行してFlaskアプリケーションを初期化します。
flask init project
-
データベースの作成
以下のコマンドを実行して、SQLiteデータベースを作成します。
flask db init
-
モデルの作成
project/models.py
ファイルを作成し、以下のコードを追加します。from sqlalchemy import Column, Integer, String, Text from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Article(Base): __tablename__ = 'articles' id = Column(Integer, primary_key=True) title = Column(String(255)) content = Column(Text)
このコードは、
articles
という名前のテーブルを作成し、そのテーブルにはid
、title
、content
という3つの列があることを定義しています。 -
データベースのマイグレーション
以下のコマンドを実行して、データベースにスキーマの変更を適用します。
alembic upgrade head
-
アプリケーションの実行
flask run
これで、ブラウザを開いて
http://localhost:5000
にアクセスすると、空のブログ記事一覧が表示されます。 -
新しい記事の作成
from flask import Flask, render_template, request from project.models import db, Article app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///project.db' db.init_app(app) @app.route('/') def index(): articles = Article.query.all() return render_template('index.html', articles=articles) @app.route('/create', methods=['GET', 'POST']) def create(): if request.method == 'POST': title = request.form['title'] content = request.form['content'] article = Article(title=title, content=content) db.session.add(article) db.session.commit() return redirect('/') return render_template('create.html')
index.html
とcreate.html
というテンプレートファイルを作成します。index.html
<!DOCTYPE html> <html> <head> <title>Blog</title> </head> <body> <h1>Blog Articles</h1> <ul> {% for article in articles %} <li> <h2>{{ article.title }}</h2> <p>{{ article.content }}</p> </li> {% endfor %} </ul> <a href="/create">Create new article</a> </body> </html>
create.html
<!DOCTYPE html> <html> <head> <title>Create new article</
SQLAlchemy + Alembic: スキーマ移行の作成 - その他の方法
チュートリアルでは、以下の方法を紹介しました。
alembic revision
コマンドを使用して新しい移行ファイルを作成するalembic upgrade head
コマンドを使用してデータベースにスキーマの変更を適用する
Alembicには、スキーマ移行を作成するための他にも多くの方法があります。
このセクションでは、その他の方法について簡単に説明します。
Alembic CLIを使用する
Alembicには、コマンドラインインターフェース(CLI)が付属しています。 このCLIを使用して、移行の作成、適用、元に戻しなど、さまざまな操作を実行できます。
CLIの詳細については、Alembicのドキュメントを参照してください: https://alembic.sqlalchemy.org/en/latest/api/commands.html
Alembicには、Python APIも用意されています。 このAPIを使用して、移行をプログラムで作成および適用できます。
APIの詳細については、Alembicのドキュメントを参照してください: https://docs.alembic.io/
Flask-Migrateは、FlaskアプリケーションでAlembicを使用するための拡張機能です。 この拡張機能を使用すると、Flaskコマンドを使用して移行を簡単に作成および適用できます。
Flask-Migrateの詳細については、Flask-Migrateのドキュメントを参照してください: https://flask-migrate.readthedocs.io/
その他のツールを使用する
以下に、いくつかの例を示します。
- Liquibase
- DBmate
- Evolve
これらのツールの詳細については、それぞれのドキュメントを参照してください。
Alembicは、データベーススキーマの変更を管理するための強力なツールです。
自分に合った方法を選択してください。
sqlalchemy alembic flask-migrate