Waseem
Waseem

Reputation: 1408

Alembic not generating correct changes

I am using Flask-Migrate==2.0.0. Its not detecting the changes correctly. Every time I run python manage db migrate it generates a script for all models although they have been added successfully in previous revisions. I have added two new columns to a table, migration revision is supposed to have only those two new columns instead all tables are added to it. Is there anything I am missing?

EDIT 1

Here is whats happening. I added Flask_Migrate to my project.

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

Flask-Migrate generated tables for models plus alembic_version table with having revision

985efbf37786

After this I made some changes. I added two new columns in one of my table and run the command again

python manage db migrate

It generated new revision

934ba2ddbd44

but instead of adding just only those two new columns, the revision contains script for all tables plus those two new columns. So for instance in my first revision, I have something like this

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'
)

The second revision also contains exactly the same code. I don't understand why if its already generated.

I googled it a little and my problems looks exactly like this https://github.com/miguelgrinberg/Flask-Migrate/issues/93 but I am not using oracle DB. I am using Postgresql. Also I don't know if it has any effect but I am not creating my tables in Default Public Schema, instead I am creating two new schemas (schema_a and schema_b) as I have a lot of tables(Around 100). So just to arrange them.

EDIT 2

The first problem seems to have resolved by adding

include_schemas=True

in env.py.

Now the new migration is not trying to create already existing tables again but it has some issues with foreign keys. Every time I create a new revision, it tries to remove the already existing foreign keys and then tries to add them. Logs looks like this

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

I have tried adding name to each Foreign Key constraint but that doesn't have any effect.

Upvotes: 2

Views: 5171

Answers (2)

sharma
sharma

Reputation: 599

Thanks for coming back and providing your feedback after you solved the issue. I had grief with the same issue for 2 hours while using postgres

Btw, I would like to point out that you would have to include the include_schemas option in the block context.configure, like so:

context.configure(connection=connection,
                  target_metadata=target_metadata,
                  include_schemas=True,
                  process_revision_directives=process_revision_directives,
                  **current_app.extensions['migrate'].configure_args)

Upvotes: 5

Waseem
Waseem

Reputation: 1408

Setting search_path to public fixed this issue. I always thought that in addition to setting schema info explicitly on each model, we also need to add those schemas on search_path. I was wrong. Changing postgresql search_path is not necessary once schemas are defined explicitly on each model.

The search path means that reflected foreign key definitions will not match what you have in your model. This only applies to foreign keys because that's how Postgresql does it. Read through http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#remote-schema-table-introspection-and-postgresql-search-path for background. - Michael Bayer

Upvotes: 2

Related Questions