web-dev-qa-db-ja.com

alembic utilコマンドエラーで識別子が見つかりません

私はプロジェクトでローカル移行を処理するためにalembicを使用しようとしています。それは最初はうまくいきましたが、フォルダを削除して再起動する必要がありました(理由を聞かないで、ただしなければなりませんでした)私は このチュートリアル に従っていて、コマンドを実行します

python manage.py db init

そしてそれは大丈夫だった。しかし、実行しようとすると

python manage.py db migrate

私はこのエラーを受け取っています:

alembic.util.CommandError: Can't locate revision identified by '31b8ab83c7d'

現在、alembicはもう存在しないリビジョンを探しているようです。とにかくalembicにそのファイルを忘れさせる方法はありますか?または、「なし」から「自動生成」への比較を再開しますか?

33
André Heringer

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

そして、あなたはアレンビックでの作業移行にうまくいくはずです。

74
SirKaiserKai

SirKaiserKaiのソリューションは私にとってはうまくいきませんでした。おそらく、前回保存していたファイルを移行して削除したときに愚かな間違いを犯したからでしょう。

alembic_revisionテーブルを削除する代わりに、version_numの値を更新して、DBが存在することがわかっている場所に一致するようにしました。

データベースの現在の状態に一致するファイルの移行IDを使用していることを確認してください

  1. 不足している移行番号を確認

    psql=> SELECT * FROM alembic_version;
    +-------------------------+
    |      version_num        |
    +-------------------------+
    | <the missing migration> |
    +-------------------------+
    (1 row)
    
  2. 値を更新する

    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>を実行できます。これにより、この状態の後のすべての移行も実行されます。

14
Shonin