映射属性的基础查询

时间:2011-08-24 07:30:17

标签: python orm sqlalchemy

如果我有一个sqlalchemy映射的实例。我可以获得与所述实例的属性相对应的基础动态查询对象吗?

例如:

e = Employee()
e.projects

#how do I get a query object loaded with the underlying sql of e.projects

2 个答案:

答案 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])

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

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

答案 1 :(得分:0)

一般不确定这个问题,但您肯定可以通过设置echo=True来启用SQL日志记录,这将在您尝试获取属性值时立即记录SQL语句。
根据您的relationship配置,它可能已被急切预加载。