alembic autogenerate获取Flask-SQLAlchemy绑定

时间:2016-04-27 01:27:10

标签: python flask flask-sqlalchemy

我的烧瓶应用程序之前有一个数据库(db1),现在我绑定了一个新的数据库(db2),它们都有10个表。

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root@localhost:3306/db1'

SQLALCHEMY_BINDS = {
    'test':    'mysql+pymysql://root@localhost: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函数分别自动检测和生成db 1和db2的迁移,但db.metadata将获取所有表元数据,但是如何获取绑定db元数据?

谢谢@davidism的帮助!我可以使用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 个答案:

答案 0 :(得分:1)

您不能,因为该功能尚不存在。目前,所有绑定中的所有模型都有一个元数据实例。只要所有模型都有唯一的名称,这不是一个大问题。

当我们应用this patch并发布新版本时,每个绑定都将拥有自己的元数据。然后,您可以使用db.get_metadata(bind='db2')访问它。