python在sql查询中避免使用%s

时间:2014-05-27 04:48:08

标签: python sql

我正在尝试从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通配符? (实际查询更长,涉及更多变量)

4 个答案:

答案 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)

两件事:

  1. 不要在SQL查询中使用字符串格式('%s' % some_var)。相反,将字符串作为序列(如列表或元组)传递给execute方法。

  2. 您可以转义%,因此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')