我见过几个类似的线程,但尝试转义字符对我不起作用。
简而言之,我有一个字符串列表,我正在对其进行迭代,因此我的目标是构建一个查询,将列表中的许多字符串合并到“选择,喜欢”查询中。
这是我的代码(Python)
def myfunc(self, cursor, var_list):
query = "Select var FROM tble_tble WHERE"
substring = []
length = len(var_list)
iter = length
for var in var_list:
if (iter != length):
substring.append(" OR tble_tble.var LIKE %'%s'%" % var)
else:
substring.append(" tble_tble.var LIKE %'%s'%" % var)
iter = iter - 1
for str in substring:
query = query + str
...
这应该够了。如果从我之前陈述的声明中看不出来,我正在尝试构建一个查询来运行 SQL“LIKE” 列表 相关字符串。
感谢您抽出时间,如有任何问题,请随时提出。
最佳答案
首先,你的问题与SQL无关。扔掉所有与 SQL 相关的代码并执行此操作:
var = 'foo'
" OR tble_tble.var LIKE %'%s'%" % var
你会得到同样的错误。这是因为您正在尝试使用包含杂散 %
符号的字符串进行 %
格式化。因此,它试图找出如何处理 %'
,但失败了。
你可以像这样避开这些杂散的 %
标志:
" OR tble_tble.var LIKE %%'%s'%%" % var
但是,这可能不是您想要做的。
首先,考虑使用 {}
-formatting 而不是 %
-formatting,尤其是当您尝试使用 %
个字符。它避免了转义它们的需要。所以:
" OR tble_tble.var LIKE %'{}'%".format(var)
但是,更重要的是,您根本不应该进行这种格式化。不要将值格式化为 SQL 字符串,只需将它们作为 SQL 参数传递即可。如果您使用的是 sqlite3,请使用 ?
参数标记;对于 MySQL,%s
;对于不同的数据库,请阅读其文档。所以:
" OR tble_tble.var LIKE %'?'%"
这里没有什么可以出错的,也没有什么需要逃避的。当您使用查询字符串调用 execute
时,将 [var]
作为参数传递。
这要简单得多,而且通常速度更快,并且巧妙地避免了很多处理边缘情况的愚蠢错误,而且最重要的是,它可以防止 SQL 注入(inject)攻击。
sqlite3 docs更详细地解释一下:
Usually your SQL operations will need to use values from Python variables. You shouldn’t assemble your query using Python’s string operations… Instead, use the DB-API’s parameter substitution. Put
?
as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’sexecute()
method. (Other database modules may use a different placeholder, such as %s or :1.) …
最后,正如其他人在评论中指出的那样,对于 LIKE
条件,您必须将百分号放在引号内部,而不是外部。所以,无论你用哪种方式解决这个问题,你都会有另一个问题需要解决。但是那一个应该容易得多。 (如果没有,您随时可以回来问另一个问题。)
关于python - "ValueError: Unsupported format character ' "' (0x22) 在...”在 Python/字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18002643/