migrations = produce_migrations(mc, metadata)
operations = Operations(mc)
stack = [migrations.upgrade_ops]
while stack:
elem = stack.pop(0)
if hasattr(elem, "ops"):
stack.extend(elem.ops)
else:
# work around Alembic issue #753
if hasattr(elem, "column"):
elem.column = elem.column.copy()
operations.invoke(elem)
full example below
from alembic.migration import MigrationContext
from alembic.autogenerate import produce_migrations
from sqlalchemy.schema import SchemaItem
from sqlalchemy.types import TypeEngine
from sqlalchemy import create_engine, MetaData, Column, Integer, String, Table
import pprint
from alembic.operations import Operations
engine = create_engine("mysql://scott:tiger@localhost/test", echo=True)
with engine.connect() as conn:
m = MetaData()
m.reflect(conn)
m.drop_all(conn)
conn.execute(
"""
create table foo (
id integer not null primary key,
old_data varchar(50),
x integer
)"""
)
conn.execute(
"""
create table bar (
data varchar(50)
)"""
)
metadata = MetaData()
Table(
"foo",
metadata,
Column("id", Integer, primary_key=True),
Column("data", Integer),
Column("x", Integer, nullable=False),
)
Table("bat", metadata, Column("info", String(100)))
mc = MigrationContext.configure(engine.connect())
migrations = produce_migrations(mc, metadata)
operations = Operations(mc)
stack = [migrations.upgrade_ops]
while stack:
elem = stack.pop(0)
if hasattr(elem, "ops"):
stack.extend(elem.ops)
else:
# work around Alembic issue #753
if hasattr(elem, "column"):
elem.column = elem.column.copy()
operations.invoke(elem)