【问题标题】:How to get Peewee ORM contains column working with join如何获取 Peewee ORM 包含使用连接的列
【发布时间】:2019-09-06 11:45:32
【问题描述】:

我正在跨两个表进行连接,设置非常简单,但是当我添加引用正在连接的表中的列的 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 的输出 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 方法来让它工作。

【问题讨论】:

    标签: python peewee


    【解决方案1】:

    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

    【讨论】:

    • 感谢您的快速响应!那次提交是我为什么喜欢 peewee 的一个例子——它通常以一种对我来说很直观的方式表现。
    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多