django raw sql - json params没有按预期执行 - 语法错误

时间:2017-11-21 07:27:07

标签: python django postgresql

我在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"

我已经尝试了大约两个小时,谷歌让我失望了!

1 个答案:

答案 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

结果是文字,后跟关键字NewStreet,以及另一个文字。请注意这可能如何打开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()