Python避免在SQL查询中使用%s

3 投票
4 回答
8063 浏览
提问于 2025-04-18 07:40

我正在尝试用Python从MySQL数据库查询数据,但在生成查询时遇到了麻烦,主要是因为通配符%和Python中的%s之间的冲突。为了解决这个问题,我发现可以使用?作为替代,但当我运行以下代码时,

query = '''select * from db where name like'Al%' and date = '%s' ''', myDateString

我收到了一个错误提示

cursor.execute(s %'2015_05_21')

ValueError: 不支持的格式字符''' (0x27) 在索引36(%的位置)

我该如何将Python 2.7中的字符串构建和SQL通配符结合起来呢?(实际上查询要复杂得多,还涉及更多变量)

4 个回答

0

你没有正确使用 ?

这里有个例子: command = '''SELECT M.name, M.year FROM Movie M, Person P, Director D WHERE M.id = D.movie_id AND P.id = D.director_id AND P.name = ? AND M.year BETWEEN ? AND ?;'''

*执行这个命令时,要把占位符替换成列表 [dirName, start, end] 中的变量值。*

cursor.execute(command, [dirName, start, end])

所以,你想尝试的是:

cursor.execute(query,'2015_05_21')

0

在Python中,使用format语法来构建字符串,而在SQL中使用%s来插入变量。这样做可以避免它们之间的冲突。

1

有两件事:

  1. 在SQL查询中,不要使用字符串格式化(比如 '%s' % some_var)。应该把字符串作为一个序列(比如列表或元组)传给执行方法。

  2. 你可以对你的 % 进行转义,这样Python就不会把它当作格式说明符来处理:

    q = 'SELECT foo FROM bar WHERE zoo LIKE 'abc%%' and id = %s'
    cursor.execute(q, (some_var,))
    
2

首先,你需要对靠近Al的百分号进行转义,也就是加个特殊符号,让它不被当作普通字符处理:

'''select * from db where name like 'Al%%' and date = '%s''''

另外,遵循最佳实践,把查询参数放在execute()的第二个参数里。这样你的查询参数就会被安全处理,能够避免SQL注入的问题:

query = """select * from db where name like 'Al%%' and date = %s"""
cursor.execute(query, ('2015_05_21', ))

撰写回答