我想在我的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')
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
)。
如何将相同的表定义附加到具有不同绑定的两个模型?
答案 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']
。