【问题标题】:execute django raw querie using ilike sentence使用类似的句子执行 django 原始查询
【发布时间】:2022-11-03 01:43:12
【问题描述】:

我得到一个查询,与ORM相比,使用直接sql要简单得多,尝试直接执行它是在与ilike子句相关的部分,我尝试了不同的方法但都失败了

(添加了一个较短的查询只是为了举例说明问题)

cursor.execute("SELECT cc.name FROM customer cc WHERE name ilike '%%%s%%'", ["jan"])
cursor.execute("SELECT cc.name FROM customer cc WHERE name ilike %%%s%%", ["jan"])
cursor.execute("SELECT cc.name FROM customer cc WHERE name ilike %s", ["jan"])
cursor.execute("SELECT cc.name FROM customer cc WHERE name ilike '%%%s%%'", ["jan"])

错误:

LINE 1: SELECT cc.name FROM customer cc WHERE name ilike '%'jan'%'
LINE 1: SELECT cc.name FROM customer cc WHERE name ilike %'jan'%
LINE 1: SELECT cc.name FROM customer cc WHERE name ilike 'jan'
LINE 1: SELECT cc.name FROM customer cc WHERE name ilike '%'jan'%'

【问题讨论】:

    标签: python-3.x django django-orm


    【解决方案1】:

    ilike 等价于 __iexact lookup [Django-doc]

    Customer.objects.filter(<b>name__iexact='jan'</b>)  # equivalent to name ILIKE jan

    或者如果你想寻找一个字符串包含'jan',你可以使用__icontains [Django-doc]

    Customer.objects.filter(<b>name__icontains='jan'</b>)  # equivalent to name ILIKE '%jan%'

    或者如果这是来自另一个领域,您可以使用F-expression [Django-doc]

    from django.db.models import F
    
    
    Customer.objects.filter(name__icontains=F('fieldname'))

    【讨论】:

    • 嘿,感谢您的评论,尽管我正在寻找的是执行具有变量的 ilike 查询的正确方法,例如“SELECT cc.name FROM customer cc WHERE name ilike '%{name}%'”。
    • @CarlosRojas:在这种情况下,如果是字段名,您可以使用 F 表达式。如果你想使用 Python 变量,它是 .filter(name__icontains=name) 和(第二个)name 变量的名称..
    猜你喜欢
    • 2017-04-08
    • 2020-04-29
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多