title: Integrating Alembic with SQLAlchemy
body: <p>I'm looking at a way to integrate Alembic with SQLAlchemy. What I need is a way so that Alembic detects any changes I make in <code>models.py</code> automatically and updates it in the MySQL database when I run <code>alembic revision -m "&lt;message_here&gt;"</code> and  <code>alembic upgrade head</code>.</p>
  
  <p>Here is what I have at the moment.</p>
  
  <p>This is my application directory structure.</p>
  
  <pre><code>/myapplication
      models.py
      __init__.py
      app.py
      /migrations
          env.py
          script.py.mako
          /versions
  </code></pre>
  
  <p>The <code>models.py</code> contains the following.</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>I have configured my <code>alembic.ini</code> with my database credentials at <code>sqlalchemy.url</code></p>
  
  <p>I have the following in my <code>env.py</code></p>
  
  <pre><code>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()
  </code></pre>
  
  <p>But when the run the migration using</p>
  
  <pre><code>alembic revision -m "initial"
  </code></pre>
  
  <p>It says</p>
  
  <pre><code>Generating
  migrations/versions/2d9d8de1aa80_initial.py...done
  </code></pre>
  
  <p>But when I open the <code>migrations/versions/9aa5864e4c8_initial.py</code>, this is what I see. </p>
  
  <pre><code>"""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
  </code></pre>
  
  <p>The version file has nothing about the tables I was expecting it to create and later sync with MySQL when I run the command <code>alembic upgrade head</code>. How do I configure Alembic so that when I run the <code>alembic revision</code> command, It picks the schema from <code>models.py</code> and generates a version file? I think I am missing something trivial here. Not sure what it is!</p>