2013-02-23 4 views
5

Я ищу способ интегрировать Alembic с SQLAlchemy. Мне нужен способ, чтобы Alembic обнаружил любые изменения, которые я делаю в models.py, и обновляю его в базе данных MySQL при запуске alembic revision -m "<message_here>" и alembic upgrade head.Интеграция Alembic с SQLAlchemy

Вот что у меня есть на данный момент.

Это моя структура каталога приложений.

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

models.py содержит следующее.

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) 

Я настроил мой alembic.ini с моими учетными данными базы данных на sqlalchemy.url

У меня есть следующий в моем 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() 

Но когда вводный миграция с использованием

alembic revision -m "initial" 

В нем говорится:

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

Но когда я открываю migrations/versions/9aa5864e4c8_initial.py, это то, что я вижу.

"""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 

версия файла не имеет ничего о таблицах я ожидал, что это создать, а затем синхронизировать с MySQL, когда я запускаю команду alembic upgrade head. Как настроить Alembic так, чтобы при запуске команды alembic revision, она выбирает схему с models.py и генерирует файл версии? Я думаю, что здесь нет ничего тривиального. Не уверен, что это!

ответ

7

Вы хотите запустить подкоманду ревизии с флагом -autogenerate, чтобы она проверяла модели для изменений.

alembic revision --autogenerate -m "some message" 

Убедитесь, что вы знаете о limitations of the autogenerate option.

+1

Вы правы! Благодаря :) –

Смежные вопросы