2016-04-27 2 views
0

В моем приложении флэша есть одна база данных (db1), теперь я привязываю к ней новую базу данных (db2), у обоих есть 10 таблиц.alembic autogenerate получить метаданные для привязки Flask-SQLAlchemy

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://[email protected]:3306/db1' 

SQLALCHEMY_BINDS = { 
    'test': 'mysql+pymysql://[email protected]:3306/db2' 
} 


db = SQLAlchemy() 

class table1(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
....... 
class table10(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 

class table11(db.Model): 
    __bind_key__ = 'db2' 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
...... 
class table20(db.Model): 
    __bind_key__ = 'db2' 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 

Я хочу использовать функцию Alembic AutoGenerate для автоматического обнаружения и генерации миграций для дб 1 и db2 отдельно, но db.metadata получите все таблицы метаданных, но как только получить метаданные дб привязки?


Thanks @davidism help! Я могу использовать include_symbol, чтобы сделать это.

def include_symbol(tablename, schema): 
    return tablename in ('table1', 'table2'.......'table10') # for db1 
     # return tablename not in ('table1', 'table2'.......'table10') # for db2 

with connectable.connect() as connection: 
    context.configure(
     connection=connection, 
     target_metadata=target_metadata, 
     include_symbol=include_symbol 
    ) 

ответ

1

Вы не можете, поскольку эта функция еще не существует. В настоящее время существует один экземпляр метаданных для всех моделей во всех связываниях. Пока все модели имеют уникальные имена, это не является большой проблемой.

Когда мы применяем this patch и создаем новый выпуск, каждое связывание будет иметь свои собственные метаданные. Затем вы сможете получить доступ к нему с помощью db.get_metadata(bind='db2').

+0

Спасибо за помощь! – pangpang

+0

, потому что мы используем 'alembic' для миграции, и мы хотим использовать функцию автогенерации alembic для каждого db, но' db.metadata' содержит все объекты таблиц. – pangpang

+1

Вы можете использовать функцию, которая исключает объекты, принадлежащие таблице, с ключом привязки: http://alembic.readthedocs.org/en/latest/api/runtime.html#alembic.runtime.environment.EnvironmentContext.configure.params .include_object – davidism

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