可以通过自定义 SQLObject Select 调用获得生成器吗?

Possible to get a generator over a custom SQLObject Select call?

我在 Python 中使用 SQLObject ORM,我希望能够以与 [=14] 相同的方式迭代生成器(行对象的) =],但是我从这个方法调用中得到的东西限制太多,即使使用 filter().

我想要以这种方式从 SQL 查询中得到的结果:

SELECT TableB.column_x, TableA.*
FROM TableA
INNER JOIN TableB
ON TableA.column_y = TableB.column_z;

我知道如何使用 SQLBuilder 来获得这个确切的查询:

columns = [TableB.q.column_x, TableA.q.id]  + 
  [getattr(TableA.q, col.name) for col in TableA.sqlmeta.columnList]
inner_join = sqlbuilder.INNERJOINOn(
  table1=TableA,
  table2=TableB,
  on_condition=(TableA.column_y==TableB.column_z),
)
select = sqlbuilder.sqlbuilder.Select(items=columns, join=inner_join)

从那里我可以执行这个查询:

conn = TableA._connection
rows = conn.queryAll(conn.sqlrepr(select))

但是这个returns一个元组列表,不是一个等效的生成器,就像你通过Table.select(...).filter(...)

这是 "restore_defaults" 端点的一部分,我需要还原 TableA 的(默认值, 默认值)行,我需要查看哪些默认行仍然存在并删除它们,然后将所有默认行插入 TableA 而不是 overwriting/deleting 用户可能创建的任何额外自定义行。换句话说,这是一个特定的要求,我确实需要使用上面 SQL 查询中的增强 table。

我知道我可以使用返回的元组(甚至用它们制作临时字典)进行这些检查并更新字典,但是有没有更好的方法从 SQLObject 中获取直接交互通过定期 select() 电话获得帮助?

(我们仅限于 Python 2.4,但我认为这没有太大区别)

  1. 高级API(SQLObject-inherited classes)可以一次查询多个表(连接)但是结果总是一个SQLObject实例列表所以只有一个 class 的属性立即可用。这是 explained in the FAQ. You can declare One-to-Many or Many-to-Many Relationships 和访问其他表的属性; SQLObject 将获取行并将它们自动转换为 SQLObject 实例。

  2. 更正:SQLObject.select() 不是 return 生成器,它 return 是迭代器,Iteration class. To be even more precise SQLObject.select() produces an instance of SelectResults class 在被迭代时生成 Iteration class 的实例,在调用其 next() 方法(它是迭代器!)时获取结果并将它们传递回用户。

  3. 唉,Iteration 只适用于 SelectResults。它不适用于 SQLBuilder 的查询。