本文发自 http://www.binss.me/blog/python-mysqldb-raise-error-when-excute-sentence-with-percent-symbol/,转载请注明出处。
近在使用torndb执行sql语句时报错:
TypeError: not enough arguments for format string
而当我将sql语句中的%号去掉时,则正常执行,因此判断问题出在百分号
查看track back,torndb使用了MySQLdb,而问题应该出在MySQLdb解释sql语句时将百分号识别成通配符了。
因此需要将语句中的%号转义,我们知道,在python中%的转义为%%。
能不能偷懒?搜索MySQLdb文档,发现有escape_string函数,尝试调用后发现其不处理%号。
于是只能自己写了:
def escape_string(string):
return string.replace("%", "%%")
然后使用该函数处理带%的语句,问题解决
2015-02-21 更新
这种情况只会出现在:用%来填充sql语句,然后用execute来执行的情况。
如:
sql = 'insert into items(name, url) values ("%s","%s")' % ("test", "www.abc.com/?d%efg")
db_connection.execute(sql)
但是更推荐在execute时才传入参数:
sql = 'insert into items(id, url) values (%s,%s)'
db_connection.execute(sql, "test", "www.abc.com/?d%efg")
这样就不会出现百分号报错的问题。
1F teek 9 years, 8 months ago 回复
第二种推荐的是不是不能加引号呢?"%s"
2F binss MOD 9 years, 8 months ago 回复
回复 1楼的 teek:
是的,谢谢指出,fixed。经测试,如果这里加了引号,对于字符串类型的字段会把引号也写进该字段。