2013-08-27 29 views
3

我试图从烧瓶使用“应用程序工厂”模式,但我似乎有与我的模型鸡与鸡蛋问题。 http://flask.pocoo.org/docs/patterns/appfactories/flask-sqlalchemy与“动态”模式的交叉数据库

我在导入我的模型的create_app函数中导入我的视图。所以,当我的模型被定义时,我没有在应用程序中的配置。这通常很好,使用绑定键,我可以设置模型以连接到不同的dbs。

但是,在这种情况下,我有两组模型,一组来自默认数据库,另一组设置在另一个数据库连接 - 我想交叉db连接。我知道通常的方法是添加到我的“其他数据库”模型

__table_args__ = { 'schema' : 'other_db_name' } 

但是...取决于配置,'other_db_name'可能不同。

所以,现在我已经定义了模型,它需要配置中的模式名称,但是没有配置中的模式来放入类定义中。我也可能只是在我不知道的烧瓶中遗漏了一些东西。

(附注 - 一个简单的办法,这是在查询配置的SQLAlchemy总是输出模式名,不管是什么 - 但我似乎无法找到这个设置。)

如果任何人对此有任何意见,我会非常感激。谢谢!

回答

3

从来没有尝试过这个,但你可以强迫__table_args__延迟评估,使其为declared_attr

from sqlalchemy.ext.declarative import declared_attr 

class MyModel(MySQLSettings, MyOtherMixin, Base): 
    __tablename__='my_model' 

    @declared_attr 
    def __table_args__(cls): 
     return { 'schema': current_app.config['OTHER_DB_NAME'] } 
+0

这是一个好主意,但似乎并不奏效。它看起来像声明基地仍然在定义上查找__table_args__,当我到达那里时,我仍然不在应用程序上下文中。谢谢回复! – Hoopes

+0

您应该调查为什么这不起作用。 SQLAlchemy文档多次提到'__table_args__'使用'declared_attr'。例如,参见[这里](http://docs.sqlalchemy.org/en/rel_0_8/orm/extensions/declarative.html#combining-table-mapper-arguments-from-multiple-mixins)。 – Miguel

+0

是的,我同意你的看法,我应该可以使用__table_args__这个函数 - 但是在调用declared_attr来设置表参数的时候,我还没有设置配置(通过应用程序上下文)。所以 - 我不认为这是懒惰的评估,超出烧瓶应用程序启动...... – Hoopes