如何获取使用联接的Peewee ORM contains列

2024-06-25 22:44:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在跨两个表进行连接,设置非常简单,但是当我添加一个containsstartswith引用正在连接的表中的列时,我永远无法得到结果。没有错误,但计数始终为0,尽管我知道记录存在,并且能够用原始SQL编写等价的查询,并让它返回我期望的所有结果

下面是它的样子,假设A和B是表,它们通过外键关联,我在where子句中使用的两个字段都是CharField

尽管我希望它能够:

(A.select().join(B).where(
    A.some_column.contains(B.other_column)
))

但这确实起到了预期的作用:

(A.select().join(B).where(
    SQL("t1.some_column ILIKE '%%' || t2.other_column || '%%'")
))

我希望这两个是相等的,但事实并非如此。查看第一个SQL的输出,它如下所示:

(SELECT "t1"."some_column" from "A" as "t1"
INNER JOIN "B" as "t2" ON ("t1"."b_id" = "t2"."id")
WHERE ("t1"."some_column" ILIKE %s)', ['%<CharField: B.other_column>%'])

对我来说,SQL输出的有趣之处在于它引用B.other_column的末尾。我猜如果它是t2.other_column,那么查询就会工作,但是我如何让peewee做到这一点呢?我已经尝试了我所能想到的一切,但我想不出一个简单的方法来让它工作


Tags: idsqlascolumnsomewhereselectcharfield
1条回答
网友
1楼 · 发布于 2024-06-25 22:44:19

contains方法执行参数的插值

为了实现您想要做的事情,您应该远离“contains”方法并使用ILIKE操作

A.select().join(B).where(
    A.some_column % ('%' + B.other + '%'))

第一个“%”是ILIKE的运算符重载。'%' + B.other + '%'将连接通配符以进行子字符串搜索


更新:我觉得这是一个合法的问题,所以我做了一个小改动,使.contains().startswith().endswith()方法在右边的值是字段时可以正常工作。展望未来,它应该更直观地工作

在此处提交:https://github.com/coleifer/peewee/commit/0c98f3e1f556eba10cbbdf7c386c49c64f4da41c

相关问题 更多 >