可以通过自定义 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 调用获得生成器吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历 ponyorm 实体对象

SQLObject sql到python

使用 SQLObject 将数据从一个 sqlite 数据库迁移到多个 SQLite 数据库

使用 el-select 自定义选定的值

select2 插件自定义 tag 选择问题

select2 如何自定义提示信息