如果我有一个sqlalchemy映射的实例。我可以获得与所述实例的属性相对应的基础动态查询对象吗?
例如:
e = Employee()
e.projects
#how do I get a query object loaded with the underlying sql of e.projects
答案 0 :(得分:2)
我认为您正在描述lazy="dynamic"
的{{1}}属性。
relationship()
将导致 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")
中有一个与i
类相关的类Foo
的实例Bar
。首先,我们需要获取处理关系的属性。
bars
我们希望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)
答案 1 :(得分:0)
一般不确定这个问题,但您肯定可以通过设置echo=True来启用SQL日志记录,这将在您尝试获取属性值时立即记录SQL语句。
根据您的relationship
配置,它可能已被急切预加载。