Python MySQL TypeError: not all arguments converted during

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

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!
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Ohne die Anführungsstriche bekomme ich leider die selbe Fehlermeldung. Habe diese auch erst im Verlauf meiner Tests eingebaut.
Benutzeravatar
noisefloor
User
Beiträge: 3829
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

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?
Benutzeravatar
noisefloor
User
Beiträge: 3829
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

War verständlich, Danke :D
Antworten