Alembic - migration for String length change
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.
Spot something wrong?
Found a typo, a broken link, or something that could be better? I would love to hear from you. Drop me a message and I will fix it.