mysqldb python转义?还是%s?

mysqldb python转义?还是%s?,python,mysql,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 FR

我目前正在使用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行,在execute中 TypeError:在字符串格式化过程中并非所有参数都已转换

self.cur.execute("SELECT dist FROM distance WHERE w1=%s AND w2=%s", (E(w1), E(w2)))
这可以正常工作,但是当w1或w2在\内时,转义显然失败


我个人知道,由于注入攻击等原因,%s不是传递参数的好方法。

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

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

如果我没记错,那么就不需要手动编码unicode字符串。mysqldb模块将为您执行此操作


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

更具体地说。。。
cursor.execute()
方法采用一个可选参数,该参数包含要引用并插入SQL模板/语句的值。这不是用一个简单的
%
操作符完成的
cursor.execute(一些sql,一些参数)
cursor.execute(一些sql%,一些参数)

指定任何兼容的驱动程序/模块必须提供
.paramstyle
属性,该属性可以是“qmark”、“numeric”、“named”、“format”或“pyformat”中的任意一个。。。因此,从理论上讲,可以通过内省和一点咀嚼将SQL查询字符串调整为支持的形式。这应该比自己尝试在SQL字符串中引用和插入值更安全


我特别喜欢阅读PsycoPG文档。

这才是真正的原因。