私はプロジェクトでローカル移行を処理するためにalembicを使用しようとしています。それは最初はうまくいきましたが、フォルダを削除して再起動する必要がありました(理由を聞かないで、ただしなければなりませんでした)私は このチュートリアル に従っていて、コマンドを実行します
python manage.py db init
そしてそれは大丈夫だった。しかし、実行しようとすると
python manage.py db migrate
私はこのエラーを受け取っています:
alembic.util.CommandError: Can't locate revision identified by '31b8ab83c7d'
現在、alembicはもう存在しないリビジョンを探しているようです。とにかくalembicにそのファイルを忘れさせる方法はありますか?または、「なし」から「自動生成」への比較を再開しますか?
Alembicはバージョン履歴をデータベースに保存します。したがって、データベースに保存されている値を使用してリビジョンを検索しています。個人用データベースのバージョン番号は、テーブルalembic_version
に保存されています。
mysql> SELECT * FROM alembic_version;
+-------------+
| version_num |
+-------------+
| c8ad125e063 |
+-------------+
1 row in set (0.00 sec)
ヒント:テーブルを表示するには、SQLベースのデータベースの場合は、SHOW TABLES
コマンドを使用します。
問題を解決するには、次のコマンドを使用します。
DROP TABLE alembic_version;
または、データベースバージョンテーブルの名前は何でも。そして、次のコマンドを使用して移行フォルダーを再初期化する必要があります。
python manage.py db init
そして、新しい移行を作成します。
python manage.py db migrate
そして、あなたはアレンビックでの作業移行にうまくいくはずです。
SirKaiserKaiのソリューションは私にとってはうまくいきませんでした。おそらく、前回保存していたファイルを移行して削除したときに愚かな間違いを犯したからでしょう。
alembic_revision
テーブルを削除する代わりに、version_num
の値を更新して、DBが存在することがわかっている場所に一致するようにしました。
データベースの現在の状態に一致するファイルの移行IDを使用していることを確認してください
不足している移行番号を確認
psql=> SELECT * FROM alembic_version;
+-------------------------+
| version_num |
+-------------------------+
| <the missing migration> |
+-------------------------+
(1 row)
値を更新する
psql=> UPDATE alembic_version
psql-> SET version_num = '<true state of DB>'
psql-> WHERE version_num = '<the missing migration>';
UPDATE 1
データベースが移行ファイル<true state of DB>
以外の状態にある場合、引き続きエラーが発生します。ただし、alembic upgrade head
が以前に中断した場所から継続する移行ファイルである場合は、<true state of DB>
を実行できます。これにより、この状態の後のすべての移行も実行されます。