是否可以通过自定义SQLObject Select调用获取生成器?

2024-07-08 15:49:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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\u defaults”端点的一部分,我需要还原TableA的行(默认,并且仅默认),我需要查看哪些默认行仍然存在,并在将所有默认行插入TableA之前删除它们,同时不覆盖/删除可能已创建的任何额外自定义行由用户提供。换句话说,这是一个特定的需求,我确实需要使用上面SQL查询中的扩充表。你知道吗

我意识到我可以使用返回的元组(甚至从元组中生成临时dict)进行这些检查并更新字典,但是有没有更好的方法可以通过执行常规的select()调用从SQLObject获得直接交互性呢?你知道吗

(我们仅限于Python2.4,但我认为这没有多大区别)


Tags: columns方法sql方式tablecolumnfilterconn
1条回答
网友
1楼 · 发布于 2024-07-08 15:49:36
  1. 高级API(SQLObject继承的类)可以一次查询多个表(联接),但结果总是一个SQLObject实例列表,因此只有一个类中的属性立即可用。这是explained in the FAQ。您可以声明One-to-Many or Many-to-Many Relationships并访问其他表的属性;SQLObject将自动获取行并将它们转换为SQLObject实例。

  2. 更正:SQLObject.select文件()不返回生成器,而是返回iterator,Iteration类的实例。更进一步preciseSQLObject.select文件()生成SelectResults类的实例,该实例在被迭代时生成迭代类的实例,该实例在调用其next()方法时生成(它是iterator!)获取结果并将其传递回用户。

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

相关问题 更多 >

    热门问题