在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:“%”或附近的语法错误
所以,问题是,我是否需要逃避%?看起来很奇怪
答案 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