【发布时间】:2014-03-13 22:10:03
【问题描述】:
我想使用 python peewee 预取功能。
我有三个表:A、B 和 C。
B 在其表中有一个指向A 的外键,而表C 有一个指向B 的外键。
我想选择B 中的所有行,同时预取C 中属于B 中的行。但是,我还想获取B 所属的A 中的行,因此我每次尝试从结果中访问该属性时都不会启动新查询。
这是我目前的代码:
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()
但是,由于我不再在b_query 中选择A,我相信每次访问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 中以获取b_query 会导致以下查询:
SELECT C.* from C WHERE C.B_id IN (SELECT B.*, A.* WHERE B.user_id == <user_id>)
显然这行不通。
【问题讨论】: