玩蛇网提供最新Python编程技术信息以及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 单个参数

因为题主并未提及连接数据库用的哪个库,所以假设你使用的是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

这里就涉及到一个小细节。
当创建只有一个元素的元组时,需要加一个逗号,否则解释器会当作一个字符串创建。

cursor.execute('select * from tb where name="%s"',name)

玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd13910.html

相关文章 Recommend

玩蛇网Python互助QQ群,欢迎加入-->: 106381465 玩蛇网Python新手群
修订日期:2017年05月22日 - 08时20分28秒 发布自玩蛇网

您现在的位置: 玩蛇网首页 > Python问题解答 > 正文内容
我要分享到:

必知PYTHON教程 Must Know PYTHON Tutorials

必知PYTHON模块 Must Know PYTHON Modules