如果我有一个sqlalchemy映射的实例。我可以获得与所述实例的属性相对应的底层动态查询对象吗?映射属性的基础查询
例如:
e = Employee()
e.projects
#how do I get a query object loaded with the underlying sql of e.projects
如果我有一个sqlalchemy映射的实例。我可以获得与所述实例的属性相对应的底层动态查询对象吗?映射属性的基础查询
例如:
e = Employee()
e.projects
#how do I get a query object loaded with the underlying sql of e.projects
我想你在描述relationship()
的lazy="dynamic"
属性。像
class Employee(Base):
__table_name__ = "employees"
...
projects = relationship(..., lazy="dynamic")
这将导致Employee().project
,而不是返回一个包含相关项目集合的sqlalchemy.orm.Query
实例。但是,这意味着没有(简单)方法直接访问集合。如果您仍然需要(最可能是你真的希望它是延迟加载,设置了两个relationship()
!而非
class Employee(Base):
__table_name__ = "employees"
...
projects_query = relationship(..., lazy="dynamic")
projects = relationship(..., lazy="select")
编辑:你说
我需要以某种方式获得动态查询一个已经懒惰的关系对象映射属性。
假设我们由酒店有相关的一类Bar
类Foo
的实例i
10。首先,我们需要获得处理关系的财产。
from sqlalchemy.orm.attributes import manager_of_class
p = manager_of_class(Foo).mapper.get_property('bars')
我们想的是and_
š在一起的所有列上i
,它涉及到bars
的表达式。如果您需要通过别名在Foo
上操作,请在此替换它。
e = sqlalchemy.and_(*[getattr(Foo, c.key) == getattr(i, c.key)
for c in p.local_side])
现在我们可以创建一个表达这种关系的查询。根据需要替换Foo
和Bar
的别名。
q = session.query(Foo) \
.filter(e) \
.join(Foo.bars) \
.with_entities(Bar)
不知道对一般的问题,但你绝对可以通过设置echo=True,当你试图获取属性的值将尽快登录SQL语句使SQL日志记录。
取决于您的relationship
配置,它可能已被热切预加载。
这正是我所需要的。但是,我希望在实例和映射完成后从现有属性动态生成该属性。 我需要某种方式来获取已经懒惰的关系映射属性的动态查询对象。 任何线索? – Ahmed
谢谢TokenMacGuy !!多聪明的解决方案!不能等待在代码中尝试这个! :) – Ahmed