web-dev-qa-db-fra.com

Python: ValueError: caractère de format non pris en charge '' '(0x27) à l'index 1

J'essaie d'exécuter une requête pour rechercher 3 tables dans une base de données en utilisant MySQL via Python. Chaque fois que j'essaie d'exécuter la chaîne suivante en tant que requête, cela me donne une erreur concernant la concaténation dans la chaîne.

"SELECT fileid FROM files WHERE description LIKE '%" + search + "%' OR filename LIKE '%" + search + "%' OR uploader LIKE '%" + search + "%' ORDER BY fileid DESC"

C'est l'erreur que ça me donne:

ValueError: unsupported format character ''' (0x27) at index 1

Si je supprime le caractère demandé, je dois également supprimer le%, ce qui empêche la requête de fonctionner correctement. Que puis-je faire pour résoudre ce problème, puisque je suis plutôt nouveau dans Python.

Merci, Kris

18
user1558746

Il semble que python interprète le% en tant que caractère de format printf. Essayez d'utiliser %%?

"SELECT fileid 
FROM files 
WHERE description LIKE '%%%s%%' 
    OR filename LIKE '%%%s%%' 
    OR uploader LIKE '%%%s%%' 
    ORDER BY fileid DESC" % (search, search, search)
55
Pochi

Juste pour vous info: J'ai essayé la solution de @Pochi aujourd'hui, en Python 3.6, et pour une raison quelconque, cela a provoqué un comportement inattendu. J'avais deux et trois arguments pour la chaîne de format, donc à la fin c'était:

% (Search, Search)

Ma chaîne ("recherche") a commencé par un "S" supérieur. J'ai eu le message d'erreur: 

ValueError: unsupported format character 'S' (0x53) at index 113

J'ai changé les majuscules en minuscules et l'erreur était: 

TypeError: not enough arguments for format string

Ensuite, je viens de mettre mes arguments dans double %% au début et à la fin, et cela a fonctionné. Donc, mon code ressemblait à: 

"SELECT fileid 
FROM files 
WHERE description LIKE '%%search%%' 
    OR filename LIKE '%%search%%'
    ORDER BY fileid DESC"

Une autre solution serait celle fournie par @ Alice Yuan. Elle vient de doubler le pourcentage chante, et ça marche.

0
vlad.rad

Ma solution:

query = """SELECT id, name FROM provice WHERE name LIKE %s"""
cursor.execute(query, '%%%s%%' % name)

Je pense que c'est un moyen facile de résoudre ce problème!

0
CK.Nguyen

vous pouvez essayer comme ça: 

SELECT fileid 
FROM files 
WHERE description LIKE '%%%%%s%%%%' 
OR filename LIKE '%%%%%s%%%%' 
OR uploader LIKE '%%%%%s%%%%' 
ORDER BY fileid DESC" % (search, search, search)
0
Alice Yuan