python - 可以通过自定义 SQLObject Select 调用获取生成器吗?

标签 python select inner-join python-2.4 sqlobject

我在 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,但我认为这没有太大区别)

最佳答案

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

  2. 更正:SQLObject.select() 不返回生成器,它返回迭代器,即 Iteration 的实例。类(class)。甚至更多precise SQLObject.select() 生成 SelectResults 的实例被迭代后的类会生成一个 Iteration 类的实例,该实例在调用其 next() 方法(它是迭代器!)时会获取结果并将其传递回用户。

  3. 可惜,迭代仅适用于 SelectResults。它不适用于 SQLBuilder 的查询。

关于python - 可以通过自定义 SQLObject Select 调用获取生成器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43975278/

相关文章:

python - 两个 Pygame Sprite 的 "Bullets"镜头组合成一条长线

python - 使用 Django,在查询集中的每个对象上添加特定字段的最佳实践方法是什么?

python - argparse 具有不同的模式

oracle - 如何为 ID 不同的列选择唯一值?

MySql搜索效率

mysql - 带标签的 CONCAT

Python VS 代码不连接 IPython 内核

javascript - 当复选框被选中/取消选中时触发函数?

mysql - 如何选择相反(或不在)的一组结果?

mysql - MySQL 中可以避免使用内连接吗?