web-dev-qa-db-fra.com

Problèmes MySQLdb Python (TypeError:% d format: un nombre est requis, pas str)

J'essaie de faire 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 je lance mon programme, j'obtiens l'erreur 

"Fichier" /usr/lib/pymodules/python2.6/MySQLdb/cursors.py ", ligne 151, dans execute Query = query% db.literal (args)

TypeError:% d format: un nombre est requis, pas str "

57
user721975

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

132
Keith

Comme ses données sont au format entier ou décimal, comment utiliser% s, qui est généralement utilisé pour le format de chaîne% d ou% i, devrait être utilisé pour les valeurs entières ou décimales.

1
Roshan

essaye ça :

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)
                    )
0
orain

Chaque fois que vous voyez ce type d’erreurs, utilisez la fonction type () pour vérifier les types de valeurs ou de variables, et verrez que le type est - 'str'. Signifie que python prend toutes les valeurs dans les chaînes (le type de données par défaut est string). C'est pourquoi l'erreur dite% d est pour les nombres, pas pour les chaînes. Alors considérez% s en python pour tous les types de champs.

0
jkmali

J'ai eu la même erreur, mais c'était pour une raison différente. Le problème était que la chaîne contenait un '%' et que Python était confus:

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 le nourrissais d'une chaîne ("abc"), pas d'un nombre.

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

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

0
Davide Andrea