3

ミゲルフラスコチュートリアルに基づくWebアプリがあります

したがって、データベースに sqlalchemy-migrate を使用し、移行にAlembicを使用する必要があります。構成を行うにはどうすればよいですか? sqlalchemy-migrate から Flask-Migrate に変更する方法はありますか?

db_migrate.py:

#!flask/bin/python
import imp
from migrate.versioning import api
from app import db
from config import SQLALCHEMY_DATABASE_URI
from config import SQLALCHEMY_MIGRATE_REPO
migration = SQLALCHEMY_MIGRATE_REPO + '/versions/%03d_migration.py' % (api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) + 1)
tmp_module = imp.new_module('old_model')
old_model = api.create_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
exec old_model in tmp_module.__dict__
script = api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata)
open(migration, "wt").write(script)
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print 'New migration saved as ' + migration
print 'Current database version: ' + str(api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO))
4

1 に答える 1

7

これを処理するには 3 つの方法が考えられます。2 つは比較的簡単ですが、最後の方法はかなり面倒です。

1. Flask-Migrate を使用して将来の移行のみを追跡する

これは最も簡単ですが、あまり面白くありません。新しいプロジェクトの場合と同じように Flask-Migrate をインストールしてセットアップするだけで、次に移行が必要になったときに、sqlalchemy-migrate の代わりにこれを使用できます。

欠点は、移行の現在の状態が Alembic によって記録されず、将来適用される移行のみが記録されることです。

2. データベースの現在の状態を 1 回の初期移行として追跡する

これにより、以前の方法が改善され、Flask-Migrate のリポジトリが完成しますが、sqlalchemy-migrate にあるすべての移行は、Alembic の単一の移行にまとめられます。

プロセスは次のとおりです。

  • Flask-Migrate リポジトリを作成する
  • 必要に応じて、データベースのデータをバックアップします (次のステップで失われます!)。
  • チュートリアルのスクリプトを使用してdb_downgrade.py、データベースをバージョン 0 (空のデータベース) に設定します。
  • Flask-Migrate で移行を生成します。この移行には、現在のバージョンまでのすべてのデータベースの変更が含まれます。
  • データをデータベースに復元します。
  • 通常、Flask-Migrate を使用して将来の移行を適用します。すべてのデータベース変更が Alembic にあるため、sqlalchemy-migrate リポジトリを削除できます。

3. 移行履歴全体を Flask-Migrate に転送する

これは、sqlalchemy-migrate にあるすべての移行を個別に Alembic に転送する必要があるため、最も複雑なソリューションです。

プロセスは次のとおりです。

  • Flask-Migrate リポジトリを作成する
  • 必要に応じて、データベースのデータをバックアップします (次のステップで失われます!)。
  • チュートリアルのスクリプトを使用してdb_downgrade.py、データベースをバージョン 0 (空のデータベース) に設定します。または、簡単な場合は、データベース内のすべてのテーブルを手動で削除してください。
  • アプリケーションがソース管理されていると仮定して、最初のデータベース移行に一致するコードのバージョンをチェックアウトします。
  • Flask-Migrate で移行を生成します。この移行は、最初の sqlalchemy-migrate 移行と同じです。
  • 2 番目の sqlalchemy-migrate 移行に一致するコードのバージョンをチェックアウトします。
  • Flask-Migrate で 2 番目の移行を生成します。この移行は、2 回目の sqlalchemy-migrate 移行と同じです。
  • 現在のバージョンのコードと最後のデータベース移行に到達するまで、これを続けます。
  • データをデータベースに復元します。
  • 通常、Flask-Migrate を使用して将来の移行を適用します。すべてのデータベース変更が Alembic にあるため、sqlalchemy-migrate リポジトリを削除できます。

推奨事項が必要な場合は、ほとんどの場合、#2 が最適なオプションだと思います。データベースを履歴内の特定の移行にダウングレードする必要があると予想した場合にのみ、#3 の苦痛を経験します。

于 2015-01-25T17:12:24.337 に答える