web-dev-qa-db-ja.com

フラスコ移行を完了できません

SQLAlchemyを使用してローカルのPostgresDBをセットアップしましたが、最初のエントリをコミットできません。このエラーが発生し続けます...

ProgrammingError: (ProgrammingError) relation "user" does not exist
LINE 1: INSERT INTO "user" (name, email, facebook_id, facebook_token...

フィールドがデータベースのフィールドと一致していないようです。フラスコ移行を使用して移行しようとしていますが、$ python app.py db migrateを実行するとこのエラーが発生します...

raise util.CommandError("No such revision '%s'" % id_)
alembic.util.CommandError: No such revision '39408d6b248d'

データベースのセットアップや移行が失敗したように見えるので、すべてを削除して最初から始めるのが最善かもしれませんが、その方法がわかりません。

[〜#〜] update [〜#〜]:データベースが機能し始めました(削除して再度作成しました)。ただし、移行を実行しようとしても同じエラーが発生し、「そのようなリビジョン「39408d6b248d」は無関係のプロジェクトからの移行を参照していることがわかりました。flask-migrateを再インストールしましたが、同じエラーが発生します。

18
Suraj Kapoor

フラスコ移行により、データベースに「alembic_version」という名前のテーブルが作成されます。
したがって、このテーブルを削除して、プロジェクトの移行フォルダを削除する必要があります。
そして$ python app.py db initをもう一度使用します...
$ python app.py db migrateは問題なく動作すると思います。

19
Cello Hsueh

最初のステップは、このコマンドalembic currentを実行することです。上記のエラーが発生するはずです(目標は、このコマンドが有効な応答を返すことを確認することです)。

これを取得している理由は、bc alembicであり、現在の状態について混乱しています。リビジョン39408d6b248dにいる必要があると想定していますが、そのリビジョンが無効であると判断します。

これを調査するには、alembicによって有効と見なされるリビジョンareを見つけて、次のコマンドを実行します。

alembic history --verbose

以前のすべてのリビジョンのリストが表示されます(注:各リビジョンの横にメッセージを添付することをお勧めします。それを適切なgit commitメッセージと考えてください)

Rev: 594cc72f56fd (head)
Parent: 262f40e28682
Path: ***************

    adjust context_id in log table so that it is a substring of the object_id

    Revision ID: 594cc72f56fd
    Revises: 262f40e28682
    Create Date: 2015-07-22 14:31:52.424862

Rev: 262f40e28682
Parent: 1dc902bd1c2
Path: ***************

    add context_id column to log table

    Revision ID: 262f40e28682
    Revises: 1dc902bd1c2
    Create Date: 2015-07-22 11:05:37.654553

Rev: 1dc902bd1c2
Parent: <base>
Path: ***************

    Initial database setup

    Revision ID: 1dc902bd1c2
    Revises: 
    Create Date: 2015-07-06 09:55:11.439330

リビジョン39408d6b248dは、上記のリビジョンには明らかに存在しません。このリビジョンは、データベースのalembic_tableに保存されています。dbaseに移動して次のコマンドを実行することで確認できます。

$ select * from alembic_version;
 version_num  
--------------
 57ac999dcaa7

したがって、データベースの状態を確認し、上記で出力されたリビジョンと比較して、データベースがどこに適合するかを確認する必要があります。

私の場合、dbaseをざっと見てみると、現在どのリビジョンにあるかが明らかになります。つまり、dbaseはセットアップされていますが、他のリビジョンはまだ含まれていません。

だから今私はdbaseの値を上記のhistoryコマンドから見つけた値に置き換えます:

vibereel=> update alembic_version set version_num = '1dc902bd1c2';

そして今、アランビック電流リターンを実行しています

INFO  [alembic.migration] Context impl PostgresqlImpl.
INFO  [alembic.migration] Will assume transactional DDL.
1dc902bd1c2

完了しました。

7
abbood

Alembicは移行履歴をデータベースに保持します。これが、別のリビジョンがあることをまだ認識している理由です。プロジェクトをHerokuに保持しているので、データベースの新しいコピーを取得できるようにするためにheroku pg:pull ...を実行できました。これの前に、ローカルデータベースを削除する必要があります。ローカルを削除したくない場合は、テーブルを削除することもできます。 PG CommanderをGUIツールとして使用して、データベースをすばやく参照しています。

7
lawicko

これは、データベースのテーブルalembic_versionのエントリが「39408d6b248d」であり、それに関連する移行ファイルが移行フォルダ(デフォルトではmigrations/versions)にないことを意味します。

したがって、データベースからテーブルalembic_versionを削除して、実行することをお勧めします。

$ python app.py db history移行の新しい責任者を取得するには、たとえば5301c31377f2

次に、$ python app.py db stamp 5301c31377f2を実行して、それが移行ヘッド(テーブルalembic_versionに格納される)であることをalembicに通知します。

2
Devi

PsqlまたはpgAdminを使用してデータベースが存在することを確認したとすると、このエラーは通常、それが言っていることを正確に意味します。これは、次のいずれかが原因である可能性があります。

1
Dmitri Goldring

私は同様の問題に遭遇しました。 python manage.py dbmigrateコマンドを実行した後、データベーステーブルは作成されず、データベースにはアレムビックテーブルしかありませんでした。

フラスコ移行のドキュメントで解決策を見つけました: https://flask-migrate.readthedocs.org/en/latest/

Alembicは現在、モデルに加えたすべての変更を検出するわけではないため、移行スクリプトを確認して編集する必要があります。特に、Alembicは現在インデックスを検出できません。完了したら、移行スクリプトもバージョン管理に追加する必要があります。

次に、データベースに移行を適用できます。

python manage.py db upgrade

このコマンドは、テーブルを作成し、データベースの移行を適用しました。

0
matyas

昨日同じエラーが発生しました。私の場合、リビジョン番号「39408d6b248d」は以前の移行アップグレードアクションによるものです。アップグレードスクリプトを実行するたびに、Alembicバージョンが生成され、data.sqliteに保存されます。

'39408d6b248d'より上で生成されたアップグレードを実行している必要がありますが、その後、migrations /ディレクトリ全体を削除し、すべてのアップグレードスクリプトを削除しました。データベース(例: data.sqliteはまだ「39408d6b248d」を保存していますが、それに応じた移行スクリプトは存在しません。

私のソリューションでは、データベース内のAlembicバージョン全体を削除し、すべてのアップグレードを最初から行いました。

0
byron

私も同じ問題を抱えていました。データベースのalembic_versionテーブルのバージョンによると、移行アクションは、すでに削除されている/ migrations/versionsフォルダーでそのバージョンを探しています。したがって、解決策はalembic_versionテーブルを削除することです。sqliteを使用している場合は、1。xxx.sqliteデータベースファイルを開きます。 sqlite3 xxx.sqlite2。テーブルを確認します.tables 3. alembic_versionが表示されたら、削除しますDROP TABLE alembic_version

0
mikky