我想使用python peewee prefetch功能。
我有三个表:A
,B
和C
。
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
显然这不会奏效。
答案 0 :(得分:2)
这是预取功能中的错误的结果。我在peewee的问题跟踪器上打开了一个问题,并且错误已在master(https://github.com/coleifer/peewee/issues/324)中修复。提交e9a38d24b
。