我在django应用程序(pgsql 9.6后端)中执行rawsql,如下所示:
obj=AddModel.objects.raw("""
SELECT * FROM "codeaddmodel" \
WHERE ("codeaddmodel"."data" -> 'CodeData') \
@> '[{"street": "New Street" }]'
""")
它的工作非常出色。
现在,我根据django doc执行以下操作,并使用params:
term="New Street"
obj=AddModel.objects.raw("""
SELECT * FROM "codeaddmodel" \
WHERE ("codeaddmodel"."data" -> 'CodeData') \
@> '[{"street": %s }]'
""",[term])
并抛出错误:
django.db.utils.ProgrammingError: syntax error at or near "New"
我已经尝试了大约两个小时,谷歌让我失望了!
答案 0 :(得分:5)
您正尝试在文字中使用占位符:
In [12]: cur.execute("""select ('[{"street": %s}]')::json""", ('New Street',))
---------------------------------------------------------------------------
ProgrammingError Traceback (most recent call last)
<ipython-input-12-dd23cc772072> in <module>()
----> 1 cur.execute("""select ('[{"street": %s}]')::json""", ('New Street',))
ProgrammingError: syntax error at or near "New"
LINE 1: select ('[{"street": 'New Street'}]')::json
结果是文字,后跟关键字New
和Street
,以及另一个文字。请注意这可能如何打开SQL注入的场所:
In [42]: cur.execute("""select ('[{"street": %s}]')""",
...: (""") = \' OR true OR \' = (""",))
所以不要手动引用占位符。相反,您应该使用占位符替换整个值并传递合适的值,在本例中为JSON字符串:
obj=AddModel.objects.raw("""
SELECT * FROM "codeaddmodel"
WHERE ("codeaddmodel"."data" -> 'CodeData')
@> %s
""", [json.dumps([{'street': term}])])
或者如果使用psycopg2和Django的raw只是传递值,psycopg2.extras.Json()