在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("'","''")
答案 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()
)。