从SQLAlchemy子查询中选择整个实体

时间:2014-08-21 20:33:01

标签: python-2.7 sqlalchemy

如果我在SQLAlchemy查询中指定映射类(〜=数据库表),则返回的行将包含这些类的实例:

q = sess.query(table1, table2, table3.string_column)
q.first()
==> ( <instance of table1>,
      <instance of table2>,
      'string' )

但是,如果我从子查询中选择,则返回的行包含单个列而不是类实例:

q = sess.query(table1, table2, table3.string_column)

q2 = sess.query( q.subquery() )
q2.first()
==> ( col1_of_table1, col2_of_table1, ...,
      col2_of_table2, col2_of_table2, ...,
      'string' )

有没有办法指定我想将子查询中的行保存为映射类的实例?

如果不加入映射类的新实例,我无法弄清楚如何做到这一点。 corresponding_column方法允许我从子查询中引用特定的,但我无法弄清楚如何从子查询中引用完整的实体。我试过玩select_from,但它没有给我正确的行为。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

返回实体的查询总是需要被告知这些实体 - 这就是它想要“选择”的东西。行的来源是它想要“从”选择的内容。两件事。

所以给出:

q = sess.query(table1, table2, table3.string_column)
q = q.subquery()

一旦调用了subquery(),查询的ORM-ness大部分都消失了,它只是一个SELECT对象。要从中选择实体,你必须再次命名它们,并使用select_entity_from(如果你实际上是0.7,那么select_from()就是那个;你需要具体说明“不正确的行为”:< / p>

q2 = sess.query(table1, table2, table3.string_column).select_entity_from(q)

答案 1 :(得分:0)

根据Selecting Entities from Subqueries,您可以使用关键字aliased()