mysqldb python转义?还是%s?

时间:2010-03-22 08:47:44

标签: python mysql

我目前正在使用mysqldb。

在mysqldb参数中转义字符串的正确方法是什么?

请注意E = lambda x: x.encode('utf-8') 1)所以我的连接是用charset ='utf8'设置的。

这些是我为这些论点得到的错误:w1, w2 = u'你好', u'我好'

self.cur.execute("SELECT dist FROM distance WHERE w1=? AND w2=?", (E(w1), E(w2)))
ret = self.cur.execute("SELECT dist FROM distance WHERE w1=? AND w2=?", (E(w1), E(w2)))

文件“build / bdist.linux-i686 / egg / MySQLdb / cursors.py”,第158行,执行 TypeError:不是在字符串格式化期间转换的所有参数

self.cur.execute("SELECT dist FROM distance WHERE w1=%s AND w2=%s", (E(w1), E(w2)))

这样可以正常工作,但是当w1或w2有\ inside时,转义显然会失败。

我个人知道%s不是一个很好的方法,可以通过注入攻击等方式传递arguemnts。

3 个答案:

答案 0 :(得分:4)

更具体一点...... cursor.execute()方法采用一个可选参数,该参数包含要引用并插入到SQL模板/语句中的值。这不是通过简单的%运算符完成的! cursor.execute(some_sql, some_params) NOT cursor.execute(some_sql % some_params)

相同

Python DB-API指定任何兼容的驱动程序/模块必须提供.paramstyle属性,该属性可以是'qmark','numeric','named','format'或'pyformat'中的任何一个...从理论上讲,人们可以通过内省和稍微调整来使您的SQL查询字符串适应支持的表单。这应该比尝试自己在SQL字符串中引用和插入值更安全。

我在PsycoPG文档中阅读 Warning Never, never, NEVER use Python string ... interpolation ... Not even at gunpoint. 特别有趣。

答案 1 :(得分:1)

当我记得它时,你不需要手动编码你的unicode字符串。 mysqldb模块将为您完成此任务。

mysqldb模块使用%s作为参数而不是?。这就是你的第一个例子中出错的原因。

答案 2 :(得分:0)

您可以使用三重引号和原始字符串格式

self.cur.execute(r"""SELECT dist FROM distance ... """,...)