python2.7 - python 如何执行mysql单个参数过滤

 mobiledu2502861593 发布于 2022-10-25 18:26

使用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 单个参数

2 个回答
  • cursor.execute('select * from tb where name="%s"',name)
    2022-10-26 23:42 回答
  • 因为题主并未提及连接数据库用的哪个库,所以假设你使用的是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
    

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

    2022-10-26 23:42 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有