【问题标题】:django postgres LIKE query syntax error at or near "%"django postgres LIKE 查询语法错误在“%”或附近
【发布时间】:2018-02-13 10:08:23
【问题描述】:

在 django 中,要查询 JSONB,我会这样做:

    cursor.execute("""\
    SELECT * FROM "somemodel_some_model" 
    WHERE UPPER(("somemodel_some_model"."data" 
    #>> array[0,'fieldX'])::text[]) 
    LIKE UPPER(% %s %)
    """,[my_string])

.. 我得到:

IndexError: list index out of range

我知道以上不可能是真的,因为当我使用 ORM 来实现这一点时:

obj=Some_Model.objects.filter(data__0__fieldX__icontains=search_term)

.. 我得到了结果。 为了对此进行调查,我使用 SQL 并执行以下操作:

SELECT * FROM "somemodel_some_model"
WHERE UPPER(("somemodel_some_model"."data" 
#>> array[0, 'fieldX'])::text[]) 
LIKE UPPER(%my_search_string%)

..但是,我明白了:

django.db.utils.ProgrammingError: "%" 处或附近的语法错误

所以,问题是,我需要转义 % 吗?看起来很奇怪

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    当使用 cursor.execute 时,语法应该是 LIKE %% string %% 或者如果你使用 column 和 LIKE %% || column || %%

    【讨论】:

      【解决方案2】:

      试试这个:

       cursor.execute("SELECT * FROM somemodel_some_model WHERE UPER((somemodel_some_model.data #>> array[0,'fieldX'])::text[])  LIKE UPPER(concat('%', %s, '%')) ",[my_string])
      

      因为如果你使用UPPER(% %s %)

      结果查询类似于UPPER(% 'your_string' %)(我不知道 django 是否引用文字)或UPPER(% your_string %)——这两种情况都对 SQL 无效,所以你要么在 django 中构造 [%my_string%],要么使用 concat 作为在上面的例子中

      【讨论】:

      • 不幸的是,当我使用LIKE UPPER(concat('%', %s, '%')) 时,它仍然会出现同样的错误(我认为您的陈述中有错字,缺少)
      • 是的 - 有一个错字。你确定在你的""" 中吗?.. 在"somemodel_some_model" 中不需要 - 你可以使用somemodel_some_model,与表名相同
      • 我不确定我是否理解您的最后评论,但是,当我使用 somemodel_some_model 进行其他查询时,它似乎执行得很好。
      猜你喜欢
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      相关资源
      最近更新 更多