0

私は Flask ベースのアプリケーションを使用しており、移行でデータベースの構造変更を管理できるようにしようとしています。私のデータベースは空ではなく、alembic とフラスコ移行を開始する前にテーブルとレコードが含まれています。

最初に、alembic スタンドアロンを使用しようとしました。alembic をpipインストールしてからすべてを構成し、自動生成を使用して差分を生成しました。すべて正常に動作しますが、出力は期待どおりではありませんでした:

INFO  [alembic.autogenerate.compare] Detected removed table u'user'
  Generating /Users/me/Documents/Project/app/migrations/versions/3de1151ce5de_.py ... done

したがって、テーブルuserは実際に私のデータベースに存在し (postgresql の予約済みテーブルだと思います)、削除したことはありません。また、alembic には見えないように見える他のテーブルがたくさんあります。最初は、alembic を適切に構成できなかったと思ったので、最初からやり直して、Miguel Grinberg による素晴らしいフラスコ拡張機能を試すことにしました。これはセットアップがはるかに簡単でしたが、結果はまったく同じメッセージでした.

私が間違っていることは何ですか?

編集:元のalembic env.pyの編集方法に関する重要な情報を追加することにしました:

....
import sys,os sys.path.append(os.getcwd())
import app from app import db
target_metadata = db.metadata

....

def run_migrations_online():
    """Run migrations in 'online' mode.

    In this scenario we need to create an Engine
    and associate a connection with the context.

    """
    # all the models need to be imported so they are visible when migration runs
    from app.models import Model1, Model2, Model3, Model4, Model5

...

この変更は、移行が開始される前に、alembic が私の宣言ベースとモデルを確認するために必要でした。スタンドアロンのアプローチをやめた後、flask-migrate チュートリアルに従い、そこにあるファイルには何も触れませんでした。

編集:わかりました。削除された「ユーザー」テーブルについて説明しました。それでも、私の他のモデルはスクリプトに表示されません。移行スクリプトが作成される前にアプリが開始され、sqlalechmy db.create_all()呼び出しがテーブルを作成するため、alembic は列とモデルに違いが見られないためだと思います。おそらく、間違った場所でcreate_all()を呼び出していますか?

編集:はい!それで、db.create_all()をmanager.run( )の下に移動したところ、変更が適切に検出されるようになりました。助けてくれてありがとう!

4

1 に答える 1