Maison > Questions et réponses > le corps du texte
使用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 单个参数
高洛峰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.