2011-08-24 52 views
1

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

例如:

e = Employee() 
e.projects 

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

回答

2

我想你在描述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") 

编辑:你说

我需要以某种方式获得动态查询一个已经懒惰的关系对象映射属性。

假设我们由酒店有相关的一类BarFoo的实例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]) 

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

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

这正是我所需要的。但是,我希望在实例和映射完成后从现有属性动态生成该属性。 我需要某种方式来获取已经懒惰的关系映射属性的动态查询对象。 任何线索? – Ahmed

+0

谢谢TokenMacGuy !!多聪明的解决方案!不能等待在代码中尝试这个! :) – Ahmed

0

不知道对一般的问题,但你绝对可以通过设置echo=True,当你试图获取属性的值将尽快登录SQL语句使SQL日志记录。
取决于您的relationship配置,它可能已被热切预加载。