gpt4 book ai didi

python - 映射属性的基础查询

转载 作者:行者123 更新时间:2023-12-01 06:08:05 25 4
gpt4 key购买 nike

如果我有一个 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")

编辑:你说

I need somehow to get the dynamic query object of an already lazy relationship mapped property.

假设我们有一个 Foo 类的实例 i,通过属性 bars 与类 Bar 相关。首先,我们需要获取处理关系的属性。

from sqlalchemy.orm.attributes import manager_of_class
p = manager_of_class(Foo).mapper.get_property('bars')

我们想要一个表达式,将 i 上与 bars 相关的所有列组合在一起。如果您需要通过别名对 Foo 进行操作,请在此处替换它。

e = sqlalchemy.and_(*[getattr(Foo, c.key) == getattr(i, c.key)
for c in p.local_side])

现在我们可以创建一个表达这种关系的查询。根据需要在此处替换 FooBar 的别名。

q = session.query(Foo) \
.filter(e) \
.join(Foo.bars) \
.with_entities(Bar)

关于python - 映射属性的基础查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7171920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com