如何获取 Peewee ORM 包含与连接一起工作的列
How to get Peewee ORM contains column working with join
我正在对两个 table 进行连接,设置非常简单,但是当我添加 contains
或 startswith
时引用 [=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
我正在对两个 table 进行连接,设置非常简单,但是当我添加 contains
或 startswith
时引用 [=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