【问题标题】:Possible to get a generator over a custom SQLObject Select call?可以通过自定义 SQLObject Select 调用获得生成器吗?
【发布时间】: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 中没有这样的功能。因此,如果您想要来自多个表的数据,则只能选择元组。

标签: python select inner-join python-2.4 sqlobject


【解决方案1】:
  1. 高级 API(SQLObject 继承的类)可以一次查询多个表(连接),但结果始终是 SQLObject 实例的列表,因此只有一个类的属性可以立即使用。这是explained in the FAQ。您可以声明One-to-Many or Many-to-Many Relationships 并访问其他表的属性; SQLObject 将自动获取行并将它们转换为 SQLObject 实例。

  2. 更正:SQLObject.select() 不返回生成器,它在迭代器处返回 Iteration 类的实例。更重要的是precise SQLObject.select() 生成SelectResults 类的实例,该实例在被迭代时生成 Iteration 类的实例,该实例在调用其 next() 方法(它是迭代器!)时获取结果并传递将它们返回给用户。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2023-03-15
    • 2013-07-25
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多