Integrando Alembic con SQLAlchemy

Estoy buscando una manera de integrar Alembic con SQLAlchemy. Lo que necesito es una forma para que Alembic detecte cualquier cambio que realice en models.py automáticamente y lo actualice en la base de datos MySQL cuando ejecuto una alembic revision -m "" y un alembic upgrade head .

Esto es lo que tengo en este momento.

Esta es la estructura de mi directorio de aplicaciones.

 /myapplication models.py __init__.py app.py /migrations env.py script.py.mako /versions 

El models.py contiene lo siguiente.

 from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): """ `User` stores the basic info about a user """ __tablename__ = 'user' id = Column(Integer, primary_key=True) name = Column(String(255), nullable=False) phone = Column(String(15), nullable=False) 

He configurado mi alembic.ini con mis credenciales de base de datos en sqlalchemy.url

Tengo lo siguiente en mi env.py

 from __future__ import with_statement from alembic import context from sqlalchemy import engine_from_config, pool from logging.config import fileConfig from myapplication import models # this is the Alembic Config object, which provides # access to the values within the .ini file in use. config = context.config # Interpret the config file for Python logging. # This line sets up loggers basically. fileConfig(config.config_file_name) # add your model's MetaData object here # for 'autogenerate' support # from myapp import mymodel # target_metadata = mymodel.Base.metadata target_metadata = models.Base.metadata # other values from the config, defined by the needs of env.py, # can be acquired: # my_important_option = config.get_main_option("my_important_option") # ... etc. def run_migrations_offline(): """Run migrations in 'offline' mode. This configures the context with just a URL and not an Engine, though an Engine is acceptable here as well. By skipping the Engine creation we don't even need a DBAPI to be available. Calls to context.execute() here emit the given string to the script output. """ url = config.get_main_option("sqlalchemy.url") context.configure(url=url) with context.begin_transaction(): context.run_migrations() def run_migrations_online(): """Run migrations in 'online' mode. In this scenario we need to create an Engine and associate a connection with the context. """ engine = engine_from_config( config.get_section(config.config_ini_section), prefix='sqlalchemy.', poolclass=pool.NullPool) connection = engine.connect() context.configure( connection=connection, target_metadata=target_metadata ) try: with context.begin_transaction(): context.run_migrations() finally: connection.close() if context.is_offline_mode(): run_migrations_offline() else: run_migrations_online() 

Pero cuando se ejecuta la migración usando

 alembic revision -m "initial" 

Dice

 Generating migrations/versions/2d9d8de1aa80_initial.py...done 

Pero cuando abro las migrations/versions/9aa5864e4c8_initial.py , esto es lo que veo.

 """initial Revision ID: 2d9d8de1aa80 Revises: None Create Date: 2013-02-23 12:21:52.389906 """ # revision identifiers, used by Alembic. revision = '2d9d8de1aa80' down_revision = None from alembic import op import sqlalchemy as sa def upgrade(): pass def downgrade(): pass 

El archivo de la versión no tiene nada que ver con las tablas que esperaba que creara y luego se sincronice con MySQL cuando ejecuto el comando alembic upgrade head . ¿Cómo configuro Alembic para que cuando ejecute el comando de alembic revision , elija el esquema de models.py y genere un archivo de versión? Creo que me falta algo trivial aquí. ¡No estoy seguro de lo que es!

Desea ejecutar el subcomando de revisión con el indicador –autogenerate para que inspeccione los modelos en busca de cambios.

 alembic revision --autogenerate -m "some message" 

Asegúrese de conocer las limitaciones de la opción de autogeneración .