2013-02-23 26 views
5

Szukam sposobu na integrację Alembic z SQLAlchemy. Potrzebuję sposobu, aby Alembic automatycznie wykrył wszelkie zmiany dokonane w models.py i zaktualizował je w bazie danych MySQL po uruchomieniu alembic revision -m "<message_here>" i alembic upgrade head.Integracja Alembic z SQLAlchemy

Oto, co mam w tej chwili.

To jest moja struktura katalogu aplikacji.

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

Urządzenie models.py zawiera następujące elementy.

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) 

mam skonfigurowany mój alembic.ini z moich mandatów baz danych w sqlalchemy.url

Mam następujących w moim 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() 

Ale gdy prowadzony migracja za pomocą

alembic revision -m "initial" 

Jest napisane:

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

Ale kiedy otwieram migrations/versions/9aa5864e4c8_initial.py, to właśnie widzę.

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

Wersja pliku ma nic o tabelach Spodziewałem się go do tworzenia i później synchronizacji z MySQL, kiedy uruchomić polecenie alembic upgrade head. Jak skonfigurować Alembic, aby po uruchomieniu komendy alembic revision wybrać schemat od models.py i wygenerować plik wersji? Myślę, że tutaj brakuje mi czegoś trywialnego. Nie jestem pewien co to jest!

Odpowiedz

7

Chcesz uruchomić podkomendę wersji z opcją --autogenerate, aby sprawdzić modele pod kątem zmian.

alembic revision --autogenerate -m "some message" 

Upewnij się, że znasz numer limitations of the autogenerate option.

+1

masz rację! Dzięki :) –