我正在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/