django postgres LIKE查询语法错误在“%”或附近

时间:2018-02-13 10:08:24

标签: django postgresql

在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:“%”或附近的语法错误

所以,问题是,我是否需要逃避%?看起来很奇怪

2 个答案:

答案 0 :(得分:1)

使用cursor.execute时,类似语法应为LIKE %% string %%,或者如果使用列和LIKE %% || column || %%

答案 1 :(得分:0)

试试这个:

 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无效,所以你要么给出构造[%my_string%] django,或者如上例所示使用concat