2016-09-07 43 views
0

这是我的查询。SQLAlchemy:通过加载技术undefer列

query = dbsession.query(Parent)\ 
    .options(joinedload(Parent.child))\ 
    .first() 

型号Child可通过Parent.child关系,并递延命名为“列”列。如何使用上面列出的查询来下载并加载该列?

+0

您是否尝试过加入'可供选项(undefer(Child.column))'(只猜测)? –

+0

undefer函数不接受映射器。见文档:http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#sqlalchemy.orm.undefer – drootnar

回答

2

链通过加入负载undefer选项与

joinedload(Parent.child).undefer('column') 

"Loading Along Paths"见和loaders的文档。

鉴于以下型号:

In [3]: class A(Base): 
    ...:  __tablename__ = 'a' 
    ...:  id = Column(Integer, primary_key=True) 
    ...:  

In [4]: class B(Base): 
    ...:  __tablename__ = 'b' 
    ...:  id = Column(Integer, ForeignKey('a.id'), primary_key=True) 
    ...:  value = deferred(Column(Integer)) 
    ...:  a = relationship('A', backref='bs') 
    ...: 

undeferring value

In [21]: print(session.query(A).options(joinedload(A.bs).undefer('value'))) 
SELECT a.id AS a_id, b_1.value AS b_1_value, b_1.id AS b_1_id 
FROM a LEFT OUTER JOIN b AS b_1 ON a.id = b_1.id 

没有

In [17]: print(session.query(A).options(joinedload(A.bs))) 
SELECT a.id AS a_id, b_1.id AS b_1_id 
FROM a LEFT OUTER JOIN b AS b_1 ON a.id = b_1.id 
+0

它的工作原理,谢谢! – drootnar