Maison  >  Questions et réponses  >  le corps du texte

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

高洛峰高洛峰2764 Il y a quelques jours767

répondre à tous(2)je répondrai

  • 高洛峰

    高洛峰2017-04-18 10:24:21

    Étant donné que la personne qui a posé la question n'a pas mentionné quelle bibliothèque est utilisée pour se connecter à la base de données, on suppose que vous utilisez mysqldb.
    Vous pouvez jeter un œil au code source de 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])
        ...
    

    Comme vous pouvez le voir, le paramètre args est une séquence ou un mappage facultatif, c'est-à-dire que le type attendu du paramètre args est list ou tuple.
    Regardez ensuite les paramètres d'entrée que vous avez donnés :

    >>> name = 'test'
    >>> type(name)
    <type 'str'>
    >>> type((name))
    <type 'str'>
    >>> type(('name', 1))
    <type 'tuple'>

    Donc, la solution est simple :

    >>> type((name, ))
    <type 'tuple'>
    >>> cursor.execute('select * from tb where name=%s',(name, ))
    1L
    

    Un petit détail entre en jeu ici.
    Lors de la création d'un tuple avec un seul élément, vous devez ajouter une virgule, sinon l'interpréteur le créera sous forme de chaîne.

    répondre
    0
  • 阿神

    阿神2017-04-18 10:24:21

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

    répondre
    0
  • Annulerrépondre