web-dev-qa-db-ja.com

Flask-Migrate(Alembic)でデータベースを移行またはアップグレードできない

データベースの更新にFlask-Migrate(Alembic)を使用しています。 models.pyファイルを更新しましたが、エラーが発生しました。移行を実行してデータベースをアップグレードしましたが、次のエラーが発生しました。

sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1215, 'Cannot add foreign key constraint') [SQL: u'\nCREATE TABLE topics (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\t`subjectID` INTEGER, \n\ttopic VARCHAR(150) NOT NULL, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(`subjectID`) REFERENCES subjects (id)\n)\n\n']

私がやったことは、外部キーにdb.Textではなくdb.Integerを使用することでした。

新しい移行を実行しようとすると、次のようになります。

alembic.util.CommandError: Target database is not up to date.

だから今私は行き詰まっています。データベースをアップグレードしたり、移行を実行したりできません。次のようなものを使用して、古いデータベースバージョンにダウングレードしようとしました。

python manage.py db downgrade --sql b877018671c:36949b1cca31

しかし、python manage.py db currentを実行すると、最新のデータベースバージョンが表示されます。

これに対する修正はありますか?ありがとう。

12
Pav Sidhu

Alembicは、dbバージョンをalembic_versionというテーブルに作成します。このテーブルには、単一のフィールドと行alembic_version.version_numが含まれています。この値がmigrations/versionの最新のファイルのファイル名と一致していることを確認してください。このバージョン番号は、リビジョンファイル内のrevision変数にも含まれており、通常はファイルの26行目に表示されます。データベースのバージョンと一致していることを確認してください。

もう1つのオプションは、dbを削除してalembicを使用して再作成することです。これがデータが重要ではない開発環境である場合、それが私の推奨事項です。

17

受け入れられた答えは少し複雑すぎるように感じます。私はこれと同じ問題を抱えていて、それを解決する方法は、コーディングエラーを含む移行を単に削除することでした。繰り返しますが、正しくコーディングされていないため、とにかくそれは必要ありません。 migrations/versionsフォルダーで最新のマイグレーションを見つけて削除し、マイグレーションを再度実行してアップグレードします。移行するためだけにデータベース内のデータを削除する必要はありません。

11
Taehan Stott

alembic.util.CommandError:ターゲットデータベースが最新ではありません。

次の手順を試していただけませんか?

python manage.py db stamp head
python manage.py db migrate
python manage.py db upgrade

リビジョンテーブルに指定されたリビジョンを「スタンプ」します。移行を実行しない

4
Jun