15

データベースの更新に 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と、最新のデータベースバージョンが取得され、立ち往生しています。

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

4

4 に答える 4

21

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

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

于 2015-09-27T02:20:10.927 に答える
18

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

于 2016-09-12T22:42:46.967 に答える