【问题标题】:prefetch db rows using the python peewee orm使用 python peewee orm 预取数据库行
【发布时间】:2014-03-13 22:10:03
【问题描述】:

我想使用 python peewee 预取功能。

我有三个表:ABC

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>)

显然这行不通。

【问题讨论】:

标签: python prefetch peewee


【解决方案1】:

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

【讨论】:

  • 当然——如果你认为你发现了一个错误,请不要犹豫在 github 上打开一个问题。
猜你喜欢
  • 2018-07-19
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多