使用python peewee orm预取db行

时间:2014-03-13 04:12:31

标签: python prefetch peewee

我想使用python peewee prefetch功能。

我有三个表:ABC

B在其表格中有一个外键到A,而表格C有一个B的外键。

我想选择B中的所有行,同时还预取C中属于B中的行的行。但是,我还想抓取A所属的B中的行,因此每次尝试从结果中访问该属性时,我都不会启动新查询。

这是我目前的代码:

b_query = B.select(B, A).join(A).where(B.user_id == user_id)
c_query = C.select()

prefetch(b_query, c_query)

但是,此代码失败并显示错误:OperationalError: (1241, 'Operand should contain 1 column(s)')

当我将代码更改为此时,它可以工作:

b_query = B.select().join(A).where(B.user_id == user_id)
c_query = C.select()

但是,由于我不再在A中选择b_query,我相信每次访问b.a时,它都会启动一个新查询,我试图避免这种情况。有什么建议吗?

编辑:

我做了一些更深入的研究,似乎尝试按照我最初提出的方式去做可能是不可能的。成功的机制导致此查询成为prefetch

产生的两个查询之一

SELECT C.* from C WHERE C.B_id IN (SELECT B.id FROM B WHERE B.user_id == <user_id>)

尝试将A添加到select的{​​{1}}会产生以下查询:

b_query

显然这不会奏效。

1 个答案:

答案 0 :(得分:2)

这是预取功能中的错误的结果。我在peewee的问题跟踪器上打开了一个问题,并且错误已在master(https://github.com/coleifer/peewee/issues/324)中修复。提交e9a38d24b