如何获取 Peewee ORM 包含与连接一起工作的列

How to get Peewee ORM contains column working with join

我正在对两个 table 进行连接,设置非常简单,但是当我添加 containsstartswith 时引用 [=34] 中的列=] 加入我永远得不到结果。没有错误,但计数始终为 0,尽管我知道记录存在并且能够在原始 SQL 中编写等效查询并让它 return 我期望的所有结果。

这是它的样子,假设 A 和 B 是 table,它们通过外键关联,我在 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 做到这一点?我已经尝试了所有我能想到的方法,但我想不出一个纯粹的 ORM 方法来实现它。

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