Jul*_*era 9 python reflection pylons sqlalchemy declarative
我想使用自动加载来使用现有数据库.我知道如何在没有声明性语法(model/_ init _.py)的情况下执行此操作:
def init_model(engine):
"""Call me before using any of the tables or classes in the model"""
t_events = Table('events', Base.metadata, schema='events', autoload=True, autoload_with=engine)
orm.mapper(Event, t_events)
Session.configure(bind=engine)
class Event(object):
pass
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我想使用声明性语法:
class Event(Base):
__tablename__ = 'events'
__table_args__ = {'schema': 'events', 'autoload': True}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这样我得到:
sqlalchemy.exc.UnboundExecutionError:没有引擎绑定到此Table的MetaData.通过autoload_with = <someengine>将引擎传递给表,或通过metadata.bind = <someengine>将MetaData与引擎相关联
这里的问题是我不知道在导入模型的阶段从哪里获取引擎(在autoload_with中使用它)(它在init_model()中可用).我尝试添加
meta.Base.metadata.bind(engine)
Run Code Online (Sandbox Code Playgroud)
到environment.py但它不起作用.有人找到了一些优雅的解决方案
Jul*_*era 11
好吧,我想我弄明白了.解决方案是声明模型对象model/__init__.py
.我总结说,__init__.py
从模块导入东西时导入作为第一个文件导入(在这种情况下model
),这会导致问题,因为init_model()
调用之前声明的模型对象.
为了避免这种情况,我在model
模块中创建了一个新文件,例如objects.py
.然后我Event
在这个文件中声明了所有的模型对象(比如).
然后,我可以像这样导入我的模型:
from PRJ.model.objects import Event
Run Code Online (Sandbox Code Playgroud)
此外,为了避免autoload-with
为每个表指定,我在最后添加了这一行init_model()
:
Base.metadata.bind = engine
Run Code Online (Sandbox Code Playgroud)
这样我可以声明我的模型对象没有样板代码,如下所示:
class Event(Base):
__tablename__ = 'events'
__table_args__ = {'schema': 'events', 'autoload': True}
event_identifiers = relationship(EventIdentifier)
def __repr__(self):
return "<Event(%s)>" % self.id
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7239 次 |
最近记录: |