2017-08-24 3 views
0

J'ai imprimé la sortie de ma « charge utile » que je veux enregistrer dans la base de données MySQL:TypeError: pas assez d'arguments pour la chaîne de format lorsque vous utilisez% s et un dictionnaire python

('B01MTOV8IP', '40462', '23.95', 'n/a', 'Usually ships in 24 hours', 
'https://www.amazon.com/reviews/iframe?akid=AKIAIDCPAFSAQICDTFNQ&alinkCode=xm2&asin=B01MTOV8IP&atag=reakenture-20&exp=2017-08-25T17%3A27%3A37Z&v=2&sig=3zbBXVo4cQAJueFeVeo%252F%252FejvaUOmvuwAtfB4EfMyDiU%253D', 'CHG-GSTWL') 

Il semble être quelque chose de mal avec la façon dont je suis le format avant que je le passe à se connecter.

try: 
    selling_price = product.price_and_currency 
    selling_price_v = selling_price[0]#type 
    print selling_price_v 
except Exception as e: 
    selling_price = "n/a" 

conn = MySQLdb.connect(host="clabadmin.cfcudy1fdz8o.us-east-1.rds.amazonaws.com", user="", passwd="", db="") 
payload =[ 
asin, 
bsr, 
str(selling_price_v), 
str(listing_price_v), 
# availability_type, 
availability, 
reviews, 
sku] 
print payload 
# conn = sqlite3.connect('skubsr.db') 
c = conn.cursor() 
c.execute("""UPDATE webservice_bsr 
SET 
AISN = %s, 
Best_Sellers_Rank = %s, 
selling_price = %s, 
price = %s, 
# availability_type = %s, 
availability = %s, 
reviews = %s 
WHERE ItemSKU = %s""", payload) 
conn.commit() 

Je reçois l'erreur suivante:

Traceback (most recent call last): 
    File "/home/trackstarz/clabReportScraper/bsrimport.py", line 907, in <module> 
    WHERE ItemSKU = %s""", payload) 
    File "/usr/local/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 187, in execute 
    query = query % tuple([db.literal(item) for item in args]) 
TypeError: not enough arguments for format string 
[Finished in 3.1s with exit code 1] 
+0

Pourquoi pensez-vous que le hachage fera quoi que ce soit dans la requête? –

+0

Je l'ai supprimé et la même erreur –

+0

Vous avez 8 occurrences de '% s' dans votre requête, mais' payload' n'a que 7 éléments. Un '# 'ne commente pas une partie de la requête; cela produirait simplement une erreur de syntaxe si 'c.execute' essayait réellement de l'envoyer à la base de données. – chepner

Répondre

0

Je crois que le problème est que vous avez des indicateurs de chaîne de multiples% dans votre exécution chaîne mais ne donne un seul article (dans ce cas, une liste) qu'elle ne connaît pas, devrait se décomposer en plusieurs valeurs. Essayez d'utiliser certaines des suggestions de cet article pour obtenir l'effet désiré.

Using Python String Formatting with Lists

+0

Non, la méthode 'execute()' sait comment gérer la séquence. –

1

# est utilisé uniquement pour indiquer un commentaire lorsqu'il est utilisé à l'intérieur du code Python. Dans votre requête, il se trouve dans la chaîne de requête et n'est donc pas analysé en tant qu'identificateur de commentaire, mais en tant que partie de la requête. Si vous le supprimez, il vous reste 8 %s et seulement 7 éléments payload.