我正在尝试执行查询以使用MySQL通过Python搜索数据库中的3个表。每次我尝试执行以下字符串作为查询时,它都会给出关于字符串中串联的错误。
"SELECT fileid FROM files WHERE description LIKE '%" + search + "%' OR filename LIKE '%" + search + "%' OR uploader LIKE '%" + search + "%' ORDER BY fileid DESC"
这是它给我的错误:
ValueError: unsupported format character ''' (0x27) at index 1
如果我删除它要求的字符,那么我还必须删除%,这会阻止查询实际正常工作。我能做些什么来解决这个问题,因为我对Python很陌生。
谢谢, 克里斯
答案 0 :(得分:62)
看起来python将%解释为类似printf的格式字符。尝试使用%%?
"SELECT fileid
FROM files
WHERE description LIKE '%%%s%%'
OR filename LIKE '%%%s%%'
OR uploader LIKE '%%%s%%'
ORDER BY fileid DESC" % (search, search, search)
答案 1 :(得分:0)
SELECT fileid
FROM files
WHERE description LIKE '%%%%%s%%%%'
OR filename LIKE '%%%%%s%%%%'
OR uploader LIKE '%%%%%s%%%%'
ORDER BY fileid DESC" % (search, search, search)
答案 2 :(得分:0)
我的解决方案:
query = """SELECT id, name FROM provice WHERE name LIKE %s"""
cursor.execute(query, '%%%s%%' % name)
我认为解决此问题的方法很简单!
答案 3 :(得分:0)
仅供您参考:我今天在Python 3.6中尝试了@Pochi的解决方案,并且出于某种原因,它引发了不期望的行为。我有两个和三个格式字符串的参数,所以最后是:
% (Search, Search)
我的字符串("搜索")从上面的" S"开始。我收到了错误消息:
ValueError: unsupported format character 'S' (0x53) at index 113
我将大写改为小写,错误是:
TypeError: not enough arguments for format string
然后我只是在开头和结尾处将我的参数放在double %%中,并且它有效。所以我的代码看起来像:
"SELECT fileid
FROM files
WHERE description LIKE '%%search%%'
OR filename LIKE '%%search%%'
ORDER BY fileid DESC"
另一个解决方案是@Alice Yuan提供的解决方案。她的唱歌比例只增加了一倍,而且效果很好。
答案 4 :(得分:0)
最简单的答案是将LIKE通配符%
添加到值中。这样可以正确地引用和转义LIKE模式。
在Python 3.6+中,您可以使用f字符串在值中包含LIKE通配符%
,以将转义的字符串值正确插入SQL:
# string to find, e.g.,
search = 'find-me'
# Parameterised SQL template
sql = """SELECT fileid FROM files
WHERE description LIKE %s OR filename LIKE %s OR uploader LIKE %s
ORDER BY fileid DESC"""
# Combine LIKE wildcard with search value
like_val = f'%{search}%'
# Run query with correctly quoted and escaped LIKE pattern
cursor.execute(sql, (like_val, like_val, like_val))