我正在尝试从python查询mysql数据库,但是遇到了生成通配符%和python的%s的查询ebcasue的麻烦。作为我发现使用?的解决方案,但是当我运行以下内容时,
query = '''select * from db where name like'Al%' and date = '%s' ''', myDateString
我收到错误
cursor.execute(s %'2015_05_21')
ValueError:索引36处的格式字符'''(0x27)不受支持(%的位置)
如何结合python 2.7字符串bulding和sql通配符? (实际查询更长,涉及更多变量)
答案 0 :(得分: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', ))
答案 1 :(得分:1)
两件事:
不要在SQL查询中使用字符串格式('%s' % some_var
)。相反,将字符串作为序列(如列表或元组)传递给execute方法。
您可以转义%
,因此Python不会指望格式说明符:
q = 'SELECT foo FROM bar WHERE zoo LIKE 'abc%%' and id = %s'
cursor.execute(q, (some_var,))
答案 2 :(得分:0)
使用format
语法进行Python字符串构建,使用%s
进行SQL
插值。这样他们就不会相互冲突。
答案 3 :(得分: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')