在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:"%"或附近的语法错误
那么,问题是,我需要逃脱%吗?似乎很奇怪
使用cursor.ecute时的语法应该像 %% string %%
,或者如果您使用列,并且像 %% || column || %%
尝试以下:
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 quotes literals(或 UPPER(% your_string %)
-两种情况都不适用于sql,因此您要么给您在django中构造 [%my_string%]
,要么使用concat如上所述