私は 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( )の下に移動したところ、変更が適切に検出されるようになりました。助けてくれてありがとう!