我在 Python 中使用 SQLObject ORM,并且希望能够以与 Table.select(...) 相同的方式迭代(行对象的)生成器
,但是即使使用 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))
但这会返回一个元组列表,不是与通过执行 Table.select(...).filter(...)
获得的等效生成器
这是“restore_defaults”端点的一部分,我需要恢复(默认,并且仅默认)TableA
的行,并且我需要查看其中的哪些行默认行仍然存在,并在将所有默认行插入 TableA
之前删除它们,同时不覆盖/删除用户可能创建的任何额外自定义行。换句话说,这是一个特定的要求,我确实需要使用上面 SQL 查询中的增强表。
我意识到我可以使用返回的元组(甚至从中创建临时字典)来进行这些检查并更新字典,但是有没有更好的方法可以通过执行常规的 select()
调用?
(我们仅限于 Python 2.4,但我认为这没有太大区别)
最佳答案
高级 API(SQLObject 继承类)可以一次查询多个表(联接),但结果始终是 SQLObject 实例的列表,因此只有一个类的属性立即可用。这是explained in the FAQ 。您可以声明One-to-Many or Many-to-Many Relationships以及其他表的访问属性; SQLObject 将获取行并自动将它们转换为 SQLObject 实例。
更正:SQLObject.select() 不返回生成器,它返回迭代器,即 Iteration 的实例。类(class)。甚至更多precise SQLObject.select() 生成 SelectResults 的实例被迭代后的类会生成一个 Iteration 类的实例,该实例在调用其 next() 方法(它是迭代器!)时会获取结果并将其传递回用户。
可惜,迭代仅适用于 SelectResults。它不适用于 SQLBuilder 的查询。
关于python - 可以通过自定义 SQLObject Select 调用获取生成器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43975278/