2015-09-26 19 views
5

私はFlask-Migrate(Alembic)を使用してデータベースを更新しています。私はmodels.pyファイルを更新しましたが、エラーが発生しました。私は、マイグレーションを実行し、データベースをアップグレードするために行ってきました、しかし、私はこのエラーを得た:私が行っていた何Flask-Migrate(Alembic)でデータベースを移行またはアップグレードできません

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を実行したとき、私は私がで立ち往生していた最新のデータベースのバージョンを取得

修正プログラムはこのためにありますか。?ありがとう。

+0

まだ実行していないマイグレーション(悪いもの)があるようです。正しいものに編集するか削除して、再度移行を生成してください。 – dirn

+0

移行を削除するにはどうすればよいですか? –

+0

移行は単なるファイルです。ファイルを削除するだけです。 Flask-Migrateは通常、それらを 'migrations/version'の中に保存します。 – dirn

答えて

10

Alembicは、dbバージョンを作成したテーブルにalembic_versionという名前で格納します。このテーブルには単一のフィールドと行alembic_version.version_numが含まれています。これの値が、最新のファイルのファイル名と一致することを確認してください。migrations/version。このバージョン番号は、ファイルの26行目に一般的に表示されるrevision変数の改訂ファイル内にも含まれています。 dbバージョンと一致することを確認してください。

もう1つの方法は、dbをドロップし、alembicを使用してデータベースを再作成することです。これがデータが重要ではない開発環境であれば、それが私の推薦です。

+0

私は同じ問題を抱えていました。一つのことを混乱させる。実際には、誤って同じマイグレーションコマンドを2回実行していたので、マイグレーション/バージョンフォルダーで2つの同じマイグレーションが作成されました。最初のマイグレーションは実際にモデルに反映され、2番目のマイグレーションは空白でした。私はこのためにこの問題があると思いますか?なぜなら、alembic_versionにチェックを入れたときに、最初のマイグレーションに一致した番号が2番目のマイグレーションに一致しなかったからです。 – Humoyun

+0

2番目のマイグレーションスクリプトを開くと実際に何もしないことになるので、問題はありません。 OCD(私のような)である場合は、不要な2番目のマイグレーションファイルを削除することができます。 'alembic_version.version_num'の値が最初の(正しい)マイグレーションスクリプトのファイル名と一致するようにしてください。 –

4

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

+0

まさに私がやったこと:) – danidee

関連する問題