我正在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()调用从SQLObject获取直接的交互性?

(我们仅限于Python 2.4,但我认为这没有太大区别)

最佳答案

高级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()方法(它是iterator!)时获取结果并传递他们返回给用户。
而且,迭代仅适用于SelectResults。它不适用于SQLBuilder的查询。

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

10-08 23:23