2

を使用してFlask-Migrate==2.0.0います。変更を正しく検出していません。python manage db migrate以前のリビジョンでは正常に追加されていましたが、実行するたびにすべてのモデルのスクリプトが生成されます。テーブルに 2 つの新しい列を追加しました。移行リビジョンには、すべてのテーブルが追加される代わりに、それらの 2 つの新しい列のみが含まれているはずです。不足しているものはありますか?

編集1

これが何が起こっているかです。プロジェクトに Flask_Migrate を追加しました。

python manage db init
python manage db migrate
python manage db upgrade

モデル用のFlask-Migrate生成テーブルと、リビジョンを持つalembic_versionテーブル

985efbf37786

この後、いくつかの変更を加えました。テーブルの 1 つに 2 つの新しい列を追加し、コマンドを再度実行しました

python manage db migrate

新しいリビジョンを生成しました

934ba2ddbd44

ただし、これら 2 つの新しい列だけを追加するのではなく、リビジョンにはすべてのテーブルとこれら 2 つの新しい列のスクリプトが含まれています。たとえば、最初のリビジョンでは、次のようなものがあります

op.create_table('forex_costs',
sa.Column('code', sa.String(), nullable=False),
sa.Column('country', sa.String(), nullable=False),
sa.Column('rate', sa.Numeric(), nullable=False),
sa.PrimaryKeyConstraint('code', 'country', name='forex_costs_id'),
schema='regis'
)

2 番目のリビジョンにも、まったく同じコードが含まれています。すでに生成されている場合、その理由がわかりません。

少しグーグルで調べたところ、問題はhttps://github.com/miguelgrinberg/Flask-Migrate/issues/93とまったく同じように見えますが、Oracle DB は使用していません。Postgresql を使用しています。また、効果があるかどうかはわかりませんが、デフォルトのパブリックスキーマでテーブルを作成していません。代わりに、テーブルがたくさんあるので(約100)、2つの新しいスキーマ(schema_aとschema_b)を作成しています。だからそれらを整理するだけです。

編集2

最初の問題は、追加することで解決したようです

include_schemas=True

env.pyで。

現在、新しい移行では、既存のテーブルを再度作成しようとはしていませんが、外部キーに問題があります。新しいリビジョンを作成するたびに、既存の外部キーを削除してから追加しようとします。ログはこんな感じ

INFO  [alembic.autogenerate.compare] Detected removed foreign key (post_id)(post_id) on table album_photos
INFO  [alembic.autogenerate.compare] Detected removed foreign key (album_id)(album_id) on table album_photos
INFO  [alembic.autogenerate.compare] Detected removed foreign key (user_id)(user_id) on table album_photos
INFO  [alembic.autogenerate.compare] Detected added foreign key (album_id)(album_id) on table prodcat.album_photos
INFO  [alembic.autogenerate.compare] Detected added foreign key (post_id)(post_id) on table prodcat.album_photos
INFO  [alembic.autogenerate.compare] Detected added foreign key (user_id)(user_id) on table prodcat.album_photos

各外部キー制約に名前を追加しようとしましたが、効果はありません。

4

2 に答える 2

1

search_path を public に設定すると、この問題が修正されました。各モデルにスキーマ情報を明示的に設定するだけでなく、それらのスキーマを search_path に追加する必要があると常に考えていました。私は間違っていた。各モデルでスキーマが明示的に定義されると、postgresql search_path を変更する必要はありません。

検索パスは、反映された外部キー定義がモデル内のものと一致しないことを意味します。これは Postgresql が行う方法であるため、外部キーにのみ適用されます。 背景については、 http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#remote-schema-table-introspection-and-postgresql-search-pathを参照してください 。- マイケル・ベイヤー

于 2016-12-16T22:33:31.500 に答える