可以通过自定义 SQLObject Select 调用获得生成器吗?
Posted
技术标签:
【中文标题】可以通过自定义 SQLObject Select 调用获得生成器吗?【英文标题】:Possible to get a generator over a custom SQLObject Select call? 【发布时间】:2017-10-13 23:45:26 【问题描述】:我在 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 查询中的扩充表。
我意识到我可以使用返回的元组(甚至用它们制作临时字典)来进行这些检查并更新字典,但是有没有更好的方法来从 SQLObject 中获得直接交互性,您可以通过执行常规 @987654329 @调用?
(我们仅限于 Python 2.4,但我认为这不会有太大的不同)
【问题讨论】:
您正在寻找 Django 模型中的“注释”功能,但我认为 SQLObject 中没有这样的功能。因此,如果您想要来自多个表的数据,则只能选择元组。 【参考方案1】:高级 API(SQLObject 继承的类)可以一次查询多个表(连接),但结果始终是 SQLObject 实例的列表,因此只有一个类的属性可以立即使用。这是explained in the FAQ。您可以声明One-to-Many or Many-to-Many Relationships 并访问其他表的属性; SQLObject 将自动获取行并将它们转换为 SQLObject 实例。
更正:SQLObject.select() 不返回生成器,它在迭代器处返回 Iteration 类的实例。更重要的是precise SQLObject.select() 生成SelectResults 类的实例,该实例在被迭代时生成 Iteration 类的实例,该实例在调用其 next() 方法(它是迭代器!)时获取结果并传递将它们返回给用户。
唉,迭代只适用于 SelectResults。它不适用于 SQLBuilder 的查询。
【讨论】:
以上是关于可以通过自定义 SQLObject Select 调用获得生成器吗?的主要内容,如果未能解决你的问题,请参考以下文章