在Pyramid中使用SQlAlchemy声明性base和autoload = true

时间:2011-10-18 05:54:11

标签: python sqlalchemy pyramid

我对金字塔很新,我无法弄清楚如何在金字塔中使用autoload = true选项。我使用了pyramid_routesalchemy来使用贴纸来创建我的项目。

问题是有一个init.py文件使用了initialize_sql(这个函数定义了Base.metadata.bind = engine)。在我的一个模型类中,我想使用autoload = true选项(使用声明性基础),但我总是得到以下错误:

sqlalchemy.exc.UnboundExecutionError: No engine is bound to this Table's MetaData. Pass an engine to the Table via autoload_with=<someengine>, or associate the MetaData with an engine via metadata.bind=<someengine>

实际上,在initialize_sql函数中定义了Base.metadata.bind = engine,我不知道文件加载的顺序,但我几乎可以肯定,在模型之前加载了init.py,因此元数据已经绑定到引擎......

因此,我的问题是:如何在不改变整个 init 和模型结构的情况下在我的类中使用自动加载?

如果有人有提示......提前致谢

2 个答案:

答案 0 :(得分:1)

是的,这里的基本思想是在没有有效引擎的情况下无法声明自动加载的表,因此您需要将初始化代码与模型代码分开,并确保在设置引擎之前不会导入模型。将其连接到元数据。

下面的链接更好地描述了它,但看起来你已经采取了正确的方法。

SQLAlchemy declarative syntax with autoload (reflection) in Pylons

答案 1 :(得分:1)

从SQLAlchemy 0.8开始,您可以在创建声明性基础时使用DeferredReflection类来延迟自动加载,直到引擎连接到您的元数据:

from sqlalchemy.ext.declarative import declarative_base, DeferredReflection

Base = declarative_base(cls=DeferredReflection)

见这里:http://docs.sqlalchemy.org/en/rel_0_8/orm/extensions/declarative.html#using-reflection-with-declarative