2010-03-22 89 views
4

我目前使用mysqldb。mysqldb python逃脱?或%s?

在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))) 

文件 “建立/ bdist.linux-i686的/蛋/ MySQLdb的/ cursors.py”,线路158,在执行 类型错误:字符串中不是所有的参数转换格式

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

这工作得很好,但是当W1,W2时已经\里面,然后逃逸显然没有。

我个人知道,%s不在arguemnts传递一个很好的方法,因为注入攻击等

回答

0

当我记得正确的你可以使用三引号和原始字符串格式

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

,那么你不需要手动编码你的unicode字符串。 mysqldb模块会为你做这个。

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

+0

这就是真正的原因。 – cdonts 2014-06-27 02:06:29

4

更具体地说...... cursor.execute()方法接受一个可选参数,该参数包含要引用和插入到SQL模板/语句中的值。这不是用简单的%操作符完成的! cursor.execute(some_sql, some_params)NOT相同cursor.execute(some_sql % some_params)

Python DB-API指定任何兼容的驱动程序/模块必须提供一个.paramstyle属性,它可以是任何“QMARK”,“数字”,“名为”,“格式”或'的pyformat'...以便理论上可以通过内省和一些小工具将SQL查询字符串调整为受支持的形式。这应该比尝试引用并将值插入到SQL字符串中更安全。

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