42

我正在尝试执行查询以通过 Python 使用 MySQL 搜索数据库中的 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 很陌生。

谢谢,克里斯

4

5 回答 5

97

看起来 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)
于 2012-07-27T21:54:05.470 回答
3

仅供参考:我今天在 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 提供的解决方案。她只是把唱歌的百分比翻了一番,而且很有效。

于 2018-06-08T12:42:44.117 回答
2

我的解决方案:

query = """SELECT id, name FROM provice WHERE name LIKE %s"""
cursor.execute(query, '%%%s%%' % name)

我认为这是解决此问题的简单方法!

于 2017-05-19T10:35:05.853 回答
0

你可以这样尝试:

SELECT fileid 
FROM files 
WHERE description LIKE '%%%%%s%%%%' 
OR filename LIKE '%%%%%s%%%%' 
OR uploader LIKE '%%%%%s%%%%' 
ORDER BY fileid DESC" % (search, search, search)
于 2017-05-04T07:27:10.933 回答
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))

于 2019-10-16T08:47:36.380 回答