python2.7 - python 如何执行mysql单个参数过滤
问题描述
使用python执行mysql,报错了:
name = 'AAA’A'cursor.execute(’select * from tb where name=%s’,name)cursor.execute(’select * from tb where name=%s’,(name))
都会报错
query = query % tuple([db.literal(item) for item in args])TypeError: not all arguments converted during string formatting
但是以下不会报错:
name = 'AAA’A'cursor.execute(’select * from tb where name=%s and %s’,(name,1))
python27 如何过滤mysql 单个参数
问题解答
回答1:因为题主并未提及连接数据库用的哪个库,所以假设你使用的是mysqldb。可以看一下mysqldb的源码:
...def execute(self, query, args=None): ''' ... args -- optional sequence or mapping, parameters to use with query. ... ''' if args is not None:# 首先判断args是否为字典类型if isinstance(args, dict): # 以k-v形式填入查询语句中。 query = query % dict((key, db.literal(item)) for key, item in args.iteritems())# 当args为非字典类型时else: # 遍历args, 最后生成一个元组填入查询语句中。 query = query % tuple([db.literal(item) for item in args]) ...
可以看到,args参数为一个可选的序列或者映射,即args参数的期望类型是list或者tuple。那么回头再看一下你给的输入参数:
>>> name = ’test’>>> type(name)<type ’str’>>>> type((name))<type ’str’>>>> type((’name’, 1))<type ’tuple’>
所以,解决方法很简单:
>>> type((name, ))<type ’tuple’>>>> cursor.execute(’select * from tb where name=%s’,(name, ))1L
这里就涉及到一个小细节。当创建只有一个元素的元组时,需要加一个逗号,否则解释器会当作一个字符串创建。
回答2:cursor.execute(’select * from tb where name='%s'’,name)
相关文章:
1. javascript - vue报错,昨天也是这么写的也没报错呀,今天就报错了,不知原因。求解决2. css - font-face引入的新字体无法在火狐浏览器上显示?但是谷歌可以?3. 最新版的phpstudy的mysql版本只是5.5,有没有5.6或者5.7版本的集成版呀?4. css - 这个线怎么做,效果是竖直的效果,5. javascript - 关于微信公众号开发的一个trouble!6. html - 谁能推荐一个类似apple官网的模板,用来展示产品的?7. javascript - 这两种JS写法有什么区别8. css3 - transition transform初始display:block怎么就没移动效果?9. javascript - vue el 重复挂载 同一个实例10. javascript - avalon.js ms-on 事件绑定无效 ?