我正在尝试通过 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 还很陌生。
看起来 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)
仅供您参考:我今天在 Python 3.6 中尝试了 @Pochi 的解决方案,由于某种原因它引发了意外的行为。我有两个和三个格式字符串参数,所以最后是:
% (Search, Search)
我的字符串(“搜索”)以大写的“S”开头。我收到错误消息:
ValueError: unsupported format character 'S' (0x53) at index 113
我把大写改成了小写,错误是:
TypeError: not enough arguments for format string
然后我只是将我的参数放在开头和结尾的双 %% 内,它就起作用了。所以我的代码看起来像:
"SELECT fileid
FROM files
WHERE description LIKE '%%search%%'
OR filename LIKE '%%search%%'
ORDER BY fileid DESC"
另一种解决方案是@Alice Yuan 提供的。她只是将唱歌的百分比增加了一倍,这很有效。
我的解决方案:
query = """SELECT id, name FROM provice WHERE name LIKE %s"""
cursor.execute(query, '%%%s%%' % name)
我认为这是解决这个问题的简单方法!
最简单的答案是将 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))
你可以这样尝试:
SELECT fileid
FROM files
WHERE description LIKE '%%%%%s%%%%'
OR filename LIKE '%%%%%s%%%%'
OR uploader LIKE '%%%%%s%%%%'
ORDER BY fileid DESC" % (search, search, search)
我认为2024年最好的解决方案是
sqlalchemy.text
,这个方法让sql字符串保持应有的样子。
import sqlalchemy as sa
sqlstr = "SELECT fileid FROM files WHERE description LIKE '%" + search + "%' OR filename LIKE '%" + search + "%' OR uploader LIKE '%" + search + "%' ORDER BY fileid DESC"
conn = sa.create_engine("xxxxx")
conn.execute(sa.text(sqlstr))