【问题标题】:Attach the same SQLAlchemy table to two models with different binds将相同的 SQLAlchemy 表附加到具有不同绑定的两个模型
【发布时间】:2016-06-15 16:24:34
【问题描述】:

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

我在 config.py 中使用 SQLALCHEMY_BINDS

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)会覆盖第一类(CallOld)。

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

【问题讨论】:

  • stackoverflow.com/questions/7877196/…,您是否有理由尝试使用相同的 Table 对象,即使这些模型适用于不同的数据库。使用 mixin 可能会立即解决这个问题。
  • 这些数据库已经存在,我只需要将我的 Flask 应用程序连接到它们。第一个是旧的,第二个是新的。但是它们的结构和表名是相同的。这就是为什么我使用相同的表名。无论如何我都会检查mixin。希望这能帮助我解决问题。

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

您应该为此使用mixin

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

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

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'] 在表传递到的每个声明性类中都被覆盖了。

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2012-10-15
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多