django额外条款中的逃避引用

时间:2016-05-05 15:52:25

标签: sql django escaping

在Django中,以下语句

entity_name = "a string with a ' quote"
Fiche.objects.extra(where=["'%s' LIKE fiche_name+'%s' " % (entity_name,'%%')])

导致数据库错误:

DatabaseError: ('42000', '[42000] [FreeTDS][SQL Server]Statement(s) could not be prepared. (8180) (SQLExecDirectW)')

如果我打印发送到db后端的sql,我会看到类似这样的内容:

... 'a string with a ' quote' LIKE fiche_name+'%%'

所以我试图用反斜杠

来逃避字符串中的引号
entity_name = "a string with a \\\' quote"

这一次,查询似乎为DB后端(报价转义)做好了准备:

... 'a string with a \' quote' LIKE fiche_name+'%%'

但这会导致相同的数据库错误。

有人知道如何正确逃避报价吗?

编辑:我找到了解决问题的方法:我在每个引号中用两个引号替换我的字符串,现在可以正常工作:

entity_name = entity_name.replace("'","''")

1 个答案:

答案 0 :(得分:0)

方法为时已晚,但是正确的方法是将变量作为参数传递给.extra()

entity_name = "a string with a ' quote"
Fiche.objects.extra(where=["%s LIKE fiche_name + '%%'")], params=[entity_name])

注意:您正在执行的操作与通常执行的操作(field LIKE 'pattern%'相反,但是仍然可能。还要注意,这是特定于数据库的代码,并非所有数据库都将+用作字符串连接器(您可能必须将其切换为||CONCAT())。