将相同的SQLAlchemy表附加到具有不同绑定的两个模型

时间:2016-06-10 12:48:12

标签: python flask sqlalchemy flask-sqlalchemy

我想在我的Flask应用程序中添加两个MySQL数据库。不幸的是,这些数据库几乎相同。 它们具有相同的表名和列名,但数据不同。

我在class Book: title = model.CharField(......... class Article: title = model.CharField(......... class Rating: content_type =models.ForeignKey(ContentType, blank=True, null=True) object_id = models.PositiveIntegerField() node = GenericForeignKey('content_type', 'object_id')

中使用了SQLALCHEMY_BINDS
config.py

然后在我的SQLALCHEMY_BINDS = { 'old': 'mysql://[OLD_DB_HERE]', 'new': 'mysql://[NEW_DB_HERE]' }

models.py

问题在于,当我为两个表调用查询时,我得到相同的结果。

例如,class CallOld(db.Model): __bind_key__ = 'old' __table__ = db.Model.metadata.tables['ConferenceCall2'] class CallNew(db.Model): __bind_key__ = 'new' __table__ = db.Model.metadata.tables['ConferenceCall2'] CallOld.query.with_entities(CallOld.TenantName.distinct()).all()  返回相同的。

有趣的是,输出从两个模型类中的第二个始终。显然第二类(在这种情况下为CallNew.query.with_entities(CallNew.TenantName.distinct()).all())会覆盖第一类(CallNew)。

如何将相同的表定义附加到具有不同绑定的两个模型?

1 个答案:

答案 0 :(得分:1)

您应该使用mixin

  

使用declarative时的一个共同需求是共享一些功能,例如一组公共列......

输出始终来自第二个(新)模型绑定数据库的原因是,当您为两个模型Flask的声明性扩展work their black magic手动定义__table__时}:

def __init__(self, name, bases, d):
    bind_key = d.pop('__bind_key__', None) or getattr(self, '__bind_key__', None)
    DeclarativeMeta.__init__(self, name, bases, d)
    if bind_key is not None and hasattr(self, '__table__'):
        self.__table__.info['bind_key'] = bind_key

可以看出,在传递表的每个声明性类中都会覆盖__table__.info['bind_key']