可以通过自定义 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,但我认为这没有太大区别)
高级API(SQLObject-inherited classes)可以一次查询多个表(连接)但是结果总是一个SQLObject实例列表所以只有一个 class 的属性立即可用。这是 explained in the FAQ. You can declare One-to-Many or Many-to-Many Relationships 和访问其他表的属性; SQLObject 将获取行并将它们自动转换为 SQLObject 实例。
更正:SQLObject.select() 不是 return 生成器,它 return 是迭代器,Iteration class. To be even more precise SQLObject.select() produces an instance of SelectResults class 在被迭代时生成 Iteration class 的实例,在调用其 next() 方法(它是迭代器!)时获取结果并将它们传递回用户。
唉,Iteration 只适用于 SelectResults。它不适用于 SQLBuilder 的查询。
我在 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,但我认为这没有太大区别)
高级API(SQLObject-inherited classes)可以一次查询多个表(连接)但是结果总是一个SQLObject实例列表所以只有一个 class 的属性立即可用。这是 explained in the FAQ. You can declare One-to-Many or Many-to-Many Relationships 和访问其他表的属性; SQLObject 将获取行并将它们自动转换为 SQLObject 实例。
更正:SQLObject.select() 不是 return 生成器,它 return 是迭代器,Iteration class. To be even more precise SQLObject.select() produces an instance of SelectResults class 在被迭代时生成 Iteration class 的实例,在调用其 next() 方法(它是迭代器!)时获取结果并将它们传递回用户。
唉,Iteration 只适用于 SelectResults。它不适用于 SQLBuilder 的查询。