【问题标题】:Multiple substrings not in column, with peewee orm多个子字符串不在列中,使用 peewee orm
【发布时间】:2017-08-21 17:25:56
【问题描述】:

我正在使用带有 sqlite 表的 Peewee ORM。我有以下 sqllite 语句:

SELECT * FROM mytable WHERE name LIKE  '% string1 %' or name LIKE  '%string2 %' OR name LIKE '%string3 %' 

如何在 Peewee 中做到这一点?

注意我已阅读 http://docs.peewee-orm.com/en/latest/peewee/querying.html#query-operators ,但不确定如何在此处应用。

【问题讨论】:

    标签: python orm peewee


    【解决方案1】:

    你会想要:

    MyModel.select().where(
        MyModel.name.contains('string1') |
        MyModel.name.contains('string2') |
        MyModel.name.contains('string3'))
    

    或者,直接使用不区分大小写的 LIKE:

    MyModel.select().where(
        (MyModel.name ** '%string1%') |
        (MyModel.name ** '%string2%') |
        (MyModel.name ** '%string3%'))
    

    要做一个 NOT IN:

    MyModel.select().where(MyModel.name.not_in(['string1', 'string2']))
    

    【讨论】:

    • 感谢您的解释。我真正想要的是“不包含”,所以对于您的第一个示例,您将 '~' 放在哪里?
    • ~MyModel.name.contains('string1')~(MyModel.name ** '%string1%')
    【解决方案2】:

    您可以这样修改查询,这样就可以了:

    mytable.select().where(mytable.name == '%string1%' | mytable.name == '%string2%' | mytable.name == '%string1%')
    

    这应该适用于您的情况。

    【讨论】:

    • 谢谢你,这让我更接近了。你怎么把它变成“NOT IN”
    • 如果不在,您可以简单地使用 != 符号。
    • 这在很多层面上都是错误的。你需要一个括号,因为 python 运算符优先级会将所有这些混合成一个布尔值。此外,使用 '%' 通配符进行完全相等是没有意义的——你需要 LIKE 运算符。在 Peewee 中,您可以使用幂运算符完成此操作,或者直接跳过通配符并使用“.contains()”。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多