Recently I wanted to change the length of String field, something like:
my_field = Column(String(10), nullable=False)
to
my_field = Column(String(20), nullable=False)
After running alembic revision --autogenerate -m 'Some description'
the update
and downgrade
methods were empty.
revision = '1d9d8d3187b6'down_revision = '24a05a2fbaf1'branch_labels = Nonedepends_on = None
def upgrade(): ### commands auto generated by Alembic - please adjust! ### ### end Alembic commands ###
def downgrade(): ### commands auto generated by Alembic - please adjust! ### ### end Alembic commands ###
Why? After some research, I found the solution.
Alembic has turned off this feature by default and it doesn’t detect changes like this (documentation). You can enable it by adding compare_type=True
in context
. Edit alembic/env.py
file and add compare_type=True
in context. For me it looks like this:
Edit run_migrations_offline()
method:
context.configure( url=url, target_metadata=target_metadata, literal_binds=True, compare_type=True)
Edit run_migrations_online()
method:
context.configure( connection=connection, target_metadata=target_metadata, compare_type=True)
Since now Alembic will detect changes like this made by me.
def upgrade(): ### commands auto generated by Alembic - please adjust! ### op.alter_column('mymodel', 'myfield', existing_type=sa.VARCHAR(length=10), type_=sa.String(length=20), existing_nullable=False) ### end Alembic commands ###
def downgrade(): ### commands auto generated by Alembic - please adjust! ### op.alter_column('mymodel', 'myfield', existing_type=sa.String(length=20), type_=sa.VARCHAR(length=10), existing_nullable=False) ### end Alembic commands ###
Side note, if you get an error:
FAILED: Target database is not up to date.
this simply means that you don’t have all migrations applied. Run alembic upgrade head
and after that, migration should work correctly.