Python避免在SQL查询中使用%s
我正在尝试用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 个回答
你没有正确使用 ?
。
这里有个例子:
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')
在Python中,使用format
语法来构建字符串,而在SQL中使用%s
来插入变量。这样做可以避免它们之间的冲突。
有两件事:
在SQL查询中,不要使用字符串格式化(比如
'%s' % some_var
)。应该把字符串作为一个序列(比如列表或元组)传给执行方法。你可以对你的
%
进行转义,这样Python就不会把它当作格式说明符来处理:q = 'SELECT foo FROM bar WHERE zoo LIKE 'abc%%' and id = %s' cursor.execute(q, (some_var,))
首先,你需要对靠近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', ))