76 votes

Problèmes liés à Python MySQLdb (TypeError : %d format : a number is required, not str)

J'essaie d'effectuer l'opération d'insertion suivante :

cursor.execute("""
                    insert into tree (id,parent_id,level,description,code,start,end)
                    values (%d,%d,%d,%s,%s,%f,%f)
                    """, (1,1,1,'abc','def',1,1)
                    )

La structure de ma table MYSQL est la suivante :

id int(255),
parent_id int(255),
level int(11),
description varchar(255),
code varchar(255),
start decimal(25,4),
end decimal(25,4)

Cependant, lorsque j'exécute mon programme, j'obtiens l'erreur suivante

" Fichier "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", ligne 151, in execute requête = requête % db.literal(args)

TypeError : %d format : un nombre est requis, pas une chaîne de caractères".

182voto

Keith Points 13800

La chaîne de format n'est pas vraiment une chaîne de format Python normale. Vous devez toujours utiliser %s pour tous les domaines.

se référer à document officiel :

Si args est une liste ou un tuple, %s peut être utilisé comme un placeholder dans la requête. Si args est un dict, les %(name)s peuvent être utilisés comme caractères de remplacement dans la requête.

-> c'est-à-dire : ici %s es PAS de formateur mais est un substitut

4voto

Davide Andrea Points 99

J'ai eu la même erreur, mais pour une raison différente. Le problème était que la chaîne de caractères comprenait un '%' et cela a perturbé Python :

TemplateStr = '[....] % discount rate  [....]  %s and %s
print TemplateStr % ('abc', 'def')

Python a interprété ce "% discount" comme "%d" et a continué à se plaindre parce que je lui fournissais une chaîne ('abc') et non un nombre.

Il m'a fallu beaucoup de temps pour le comprendre !

(La solution consiste à taper %% au lieu de %).

3voto

Aminah Nuraini Points 5943

Sur la base de cette réponse https://stackoverflow.com/a/46517683/1564659

J'ai finalement utilisé %s même pour les flottants et les chiffres. Il sera converti immédiatement lorsqu'il sera inséré dans la table et que SQL détectera le type de données de la table.

0voto

orain Points 26

Essayez ceci :

cursor.execute("""
                    insert into tree (id,parent_id,level,description,code,start,end)
                    values (%s,%s,%s,'%s','%s',%s,%s)
                    """%(1,1,1,'abc','def',1,1)
                    )

-1voto

Roshan Points 17

Puisque ses données sont au format entier ou décimal, comment pouvez-vous utiliser %s qui est habituellement utilisé pour le format chaîne de caractères %d ou %i devrait être utilisé pour les valeurs entières ou décimales.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X