Seite 1 von 1
Python MySQL TypeError: not all arguments converted during
Verfasst: Freitag 11. September 2015, 12:33
von martinjo
Hallo,
ich komme bei dem Versuch nicht weiter, in einen Webshop eine Kategorie an zu legen, wohl da in dem Kategorienamen ein Komma ist.
Code: Alles auswählen
query = "INSERT INTO categories_description "
"(categories_id, language_id, categories_name) "
"VALUES ('%s', '%s', '%s')"
values = ( str(category_id), str(n+1), shop_category )
cursor.execute(query, values)
values sind: ('98', '1', 'Angebote, Neu und Sonstiges')
Fehlermeldung:
Code: Alles auswählen
cursor.execute(query, values)
File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 159, in execute
query = query % db.literal(args)
TypeError: not all arguments converted during string formatting
Ich komme nicht dahinter was hier nicht passt :K
Hat mir jemand nen Tipp, Danke!
Re: Python MySQL TypeError: not all arguments converted dur
Verfasst: Freitag 11. September 2015, 13:03
von Sirius3
@martinjo: die Anführungszeichen sind ja auch an der Stelle falsch.
Code: Alles auswählen
query = "INSERT INTO categories_description "
"(categories_id, language_id, categories_name) "
"VALUES (%s, %s, %s)"
values = (category_id, n+1, shop_category)
cursor.execute(query, values)
Re: Python MySQL TypeError: not all arguments converted dur
Verfasst: Freitag 11. September 2015, 14:15
von martinjo
Ohne die Anführungsstriche bekomme ich leider die selbe Fehlermeldung. Habe diese auch erst im Verlauf meiner Tests eingebaut.
Re: Python MySQL TypeError: not all arguments converted dur
Verfasst: Freitag 11. September 2015, 15:48
von noisefloor
Hallo,
da sind doch zu viele Anführungszeichen drin....
Code: Alles auswählen
query = """INSERT INTO categories_description
(categories_id, language_id, categories_name)
VALUES (%s, %s, %s)"""
values = (category_id, n+1, shop_category)
cursor.execute(query, values)
Und die Spaltennamen sind nicht so dolle - warum Plural? Besser bzw. präziser wäre doch `category_id` und `category_name`. Oder alternativ `languages_id`, dann wäre der Plural wenigsten konsequent durchgehend einsetzen
Gruß, noisefloor
Re: Python MySQL TypeError: not all arguments converted dur
Verfasst: Freitag 11. September 2015, 18:40
von martinjo
Danke, daran lag es.
Ich hatte zuvor, wenn ich die einzelnen Textteile genutzt habe, diese in einem Tupel. Dadurch hat "cursor.execute(query)" trotzdem noch fehlerfrei funktioniert. Aber das war wohl nur hingebogen.
Eine Frage noch etwas am Thema vorbei.
Ich bin gerade erst umgestiegen vom Formatieren der Texte mittels %s auf format(). Deswegen habe ich auch alle SQL-Befehle mit format() formatiert. Nun wird mir jedoch hier gesagt, dass der richtige Weg das formatieren mittels %s ist. In diesem Fall mittels des MySQLdb-Modules. Passt das zusammen?
Re: Python MySQL TypeError: not all arguments converted dur
Verfasst: Freitag 11. September 2015, 19:15
von noisefloor
Hallo,
das `%s` ist in diesem Fall der Platzhalter im SQL-Query - das ist halt nicht das gleich wie bei der String-Formatierung.
Die übergibst der `execute()` Funktion den String mit Platzhalter und das DB-Modul kümmert sich um das _sichere_ ersetzen der Platzhalter durch die Daten, die du zusätzlich übergibst.
Wenn den den SQL-Query (was ja auch ein String ist) selber mit `format()` zusammenbaust, dann würdest du a) der `execute()` Funktion einen fertigen Query übergeben, in dem keine Ersetzungen mehr nötig sind und b) müsstest du dich selber darum kümmern, dass den den Daten, die du mittels `format()` in den String einbaust, kein gefährlicher Quatsch steht.
Bei "reinen" String ist hingegen in der Tat `format()` der bessere Weg. Also sowas wie `print'Hallo {}'.format('Welt'))` ist schon gut.
Hoffe, dass die Erklärung verständlich ist
Gruß, noisefloor
Re: Python MySQL TypeError: not all arguments converted dur
Verfasst: Freitag 11. September 2015, 20:54
von martinjo
War verständlich, Danke
