我正在跨两个表进行连接,设置非常简单,但是当我添加一个contains
或startswith
引用正在连接的表中的列时,我永远无法得到结果。没有错误,但计数始终为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做到这一点呢?我已经尝试了我所能想到的一切,但我想不出一个简单的方法来让它工作
contains
方法执行参数的插值为了实现您想要做的事情,您应该远离“contains”方法并使用ILIKE操作
第一个“%”是ILIKE的运算符重载。
'%' + B.other + '%'
将连接通配符以进行子字符串搜索更新:我觉得这是一个合法的问题,所以我做了一个小改动,使
.contains()
、.startswith()
和.endswith()
方法在右边的值是字段时可以正常工作。展望未来,它应该更直观地工作在此处提交:https://github.com/coleifer/peewee/commit/0c98f3e1f556eba10cbbdf7c386c49c64f4da41c
相关问题 更多 >
编程相关推荐