我想将查询参数传递给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中指定多个样式。
答案 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的其他部分,例如表名,语句等。