2013-02-23 33 views
5

Tôi đang tìm cách tích hợp Alembic với SQLAlchemy. Những gì tôi cần là một cách để Alembic phát hiện bất kỳ thay đổi nào tôi thực hiện trong models.py tự động và cập nhật nó trong cơ sở dữ liệu MySQL khi tôi chạy alembic revision -m "<message_here>"alembic upgrade head.Tích hợp Alembic với SQLAlchemy

Đây là những gì tôi có vào lúc này.

Đây là cấu trúc thư mục ứng dụng của tôi.

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

models.py chứa nội dung sau.

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) 

Tôi đã cấu hình của tôi alembic.ini với các thông tin cơ sở dữ liệu của tôi tại sqlalchemy.url

Tôi đã điều sau đây trong tôi 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() 

Nhưng khi chạy di cư sử dụng

alembic revision -m "initial" 

Nó nói

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

Nhưng khi tôi mở migrations/versions/9aa5864e4c8_initial.py, đây là những gì tôi thấy.

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

Tệp phiên bản không có gì về các bảng tôi mong muốn tạo và đồng bộ hóa sau với MySQL khi tôi chạy lệnh alembic upgrade head. Làm thế nào để cấu hình Alembic để khi tôi chạy lệnh alembic revision, nó chọn lược đồ từ models.py và tạo tệp phiên bản? Tôi nghĩ rằng tôi đang thiếu một cái gì đó tầm thường ở đây. Không chắc nó là gì!

Trả lời

7

Bạn muốn chạy tiểu ban sửa đổi với cờ --autogenerate để nó kiểm tra các mô hình để thay đổi.

alembic revision --autogenerate -m "some message" 

Đảm bảo bạn biết về số limitations of the autogenerate option.

+1

bạn đã đúng! Cảm ơn :) –