我对金字塔很新,我无法弄清楚如何在金字塔中使用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 和模型结构的情况下在我的类中使用自动加载?
如果有人有提示......提前致谢
答案 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)