システムをアップグレードする際、サーバー側のデータ構造やその他の操作を更新する必要が生じることがよくあります。以前の方法では、SQL スクリプトを手動で作成していましたが、漏れが見つかり、プログラムが実行できなくなることがよくありました。サーバーにリリースされた後は通常どおり使用されます。
Flask-Migrate プラグインを使用して問題を解決できます。Flask-Migrate プラグインは、有名な SQLAlchemy 作者によって開発されたデータ移行ツールです。
具体的な操作は次のとおりです。
1. Flask-Migrate プラグインをインストールします
$ pip install Flask-Migrate
db = SQLAlchemy(app) migrate = Migrate(app, db) manager = Manager(app) manager.add_command('db', MigrateCommand)
3. 初期化
$ python app.py db init
Flask-Migrate を使用してデータベースを移行する
開発が進むにつれて、データベース モデルを変更する必要があることがわかり、その場合はデータベースを更新する必要があります。
Flask-SQLAlchemy は、データベース テーブルが存在しなくなった場合にのみモデルからデータベース テーブルを作成するため、テーブルを更新する唯一の方法は古いテーブルを破棄することです。当然、データベース内のすべてのデータが失われます。
より良い解決策は、データベース移行フレームワークを使用することです。ソース コード バージョン管理ツールがソース コード ファイルへの変更を追跡するのと同じように、データベース移行フレームワークはデータベース モデルへの変更を追跡し、増分変更をデータベースに適用します。
SQLAlchemy の主な開発者は Alembic 移行フレームワークを作成しましたが、Alembic は直接使用しません。Flask アプリケーションは、Flask-Script を統合してすべての操作コマンドを提供する軽量の Alembic パッケージである Flask-Migrate 拡張機能を使用できます。
4. 移行ウェアハウスを作成します
まず、Flask-Migrate が仮想環境にインストールされている必要があります:
(venv) $ pip install flask-migrate
次に、拡張機能がどのように初期化されるかを示します:
from flask.ext.migrate import Migrate, MigrateCommand # ... migrate = Migrate(app, db) manager.add_command('db', MigrateCommand)
データベース移行コマンドを使用するために、Flask-Migrate は Flask-Script マネージャー オブジェクトに接続するための MigrateCommand クラスを提供します。この例では、コマンドへの接続に db が使用されます。
データベースの移行を維持するには、init サブコマンドを使用して移行ライブラリを作成する必要があります。
(venv) $ python hello.py db init
Creating directory /home/flask/flasky/migrations...done Creating directory /home/flask/flasky/migrations/versions...done Generating /home/flask/flasky/migrations/alembic.ini...done Generating /home/flask/flasky/migrations/env.py...done Generating /home/flask/flasky/migrations/env.pyc...done Generating /home/flask/flasky/migrations/README...done Generating /home/flask/flasky/migrations/script.py.mako...done Please edit configuration/connection/logging settings in '/home/flask/flasky/migrations/alembic.ini' before proceeding.
このコマンドは、すべての移行スクリプトを保存する移行フォルダーを作成します。
推奨事項: GitHub 上でアプリケーションのクローンを作成している場合は、git checkout 5c を実行して、このバージョンのアプリケーションに切り替えることができます。
5. 移行スクリプトを作成します
Alembic では、データベースの移行作業は移行スクリプトによって完了します。このスクリプトには、upgrade() と downgrade() という 2 つの関数があります。 upgrade() 関数は移行の一部としてデータベースの変更を実装し、downgrade() 関数はそれらを削除します。 Alembic はデータベースの変更を追加および削除する機能を備えており、履歴の任意の時点からデータベースを再構成できます。
Alembic の移行は、手動で作成することも、リビジョン コマンドと移行コマンドを使用して自動で作成することもできます。手動移行では、Alembic の Operations オブジェクト ディレクティブを使用して実装された空の upgrade() 関数と downgrade() 関数を使用して、開発者によって移行フレームワーク スクリプトが作成されます。一方、自動移行では、モデル定義とデータベースの現在の状態との相違点を探して、upgrade() および downgrade() のコードを生成します。
警告: 自動移行は必ずしも正確であるとは限らず、一部の詳細が見落とされる可能性があります。したがって、自動的に生成された移行スクリプトは常に確認する必要があります。
merge サブコマンドは自動移行スクリプトを作成します:
(venv) $ python hello.py db migrate -m "initial migration"
INFO [alembic.migration] Context impl SQLiteImpl. INFO [alembic.migration] Will assume non-transactional DDL. INFO [alembic.autogenerate] Detected added table 'roles' INFO [alembic.autogenerate] Detected added table 'users' INFO [alembic.autogenerate.compare] Detected added index 'ix_users_username' on '['username']' Generating /home/flask/flasky/migrations/versions/1bc 594146bb5_initial_migration.py...done
推奨事項: GitHub 上でアプリケーションのクローンを作成している場合は、git checkout 5c を実行して、このバージョンのアプリケーションに切り替えることができます。このアプリケーションの移行を生成する必要はないことに注意してください。すべての移行スクリプトはリポジトリに含まれています。
6. データベースを更新します
移行スクリプトがレビューされて承認されたら、db upgrade コマンドを使用してデータベースに更新できます。
(venv) $ python hello.py db upgrade
INFO [alembic.migration] Context impl SQLiteImpl. INFO [alembic.migration] Will assume non-transactional DDL. INFO [alembic.migration] Running upgrade None -> 1bc594146bb5, initial migration
最初の移行は実際には db.create_all() を呼び出すことと同じですが、後続の移行では、upgrade コマンドはテーブルを更新しますが、テーブルの内容には影響しません。