Python MySQLdb:将参数作为命名字典查询

时间:2012-10-11 02:43:36

标签: python mysql-python

我想将查询参数传递给cursor.execute() MySQLdb方法作为命名字典,以便从SQL注入转义

你能解释为什么这会给KeyError

>>> c.execute('select id from users where username=%(user)s', {'user':'bob',})
KeyError: 'user'

MySQLdb手册http://mysql-python.sourceforge.net/MySQLdb.html说:

  

paramstyle

     

字符串常量,说明接口所需的参数标记格式的类型。设置为'format' = ANSI C printf格式代码,例如'...WHERE name=%s'。如果映射对象用于conn.execute(),则接口实际使用'pyformat' = Python扩展格式代码,例如'...WHERE name=%(name)s'。但是,API目前不允许在paramstyle中指定多个样式。

2 个答案:

答案 0 :(得分:8)

MySQLdb允许dicts作为查询参数。 This response显示了所有不同的方法。您只需提供一个secuence作为参数(元组,字典......)作为“执行”的第二个参数。请勿将查询格式化为“执行”方法的一个参数,否则您可能会遇到SQL注入攻击。参见:

"SELECT * FROM users WHERE username = '%s'" % (user)

想想如果会发生什么:

user = "peter;DROP TABLE users"   :_(

另一种方法是安全的,因为它允许MySQLdb库处理必要的检查。

我不知道出了什么问题,因为你的查询对我来说很好:

# Connect to db
# Open a cursor
stmt = "SELECT * FROM users WHERE username = %(user)s"
cursor.execute(stmt, {"user": "bob"})
user = cursor.fetchone()
print user

{'username': 'bob', 'alias': 'bobby', 'avatar': 'default', 'fullname': 'bob'}

你能给我们更多信息吗?

答案 1 :(得分:4)

您粘贴的文档中的文档中的行可能会回答您的问题:

  

参数占位符只能用于插入列值。 他们   不能用于SQL的其他部分,例如表名,语句等。