Probleme mit MySQL, Syntax und senden von Blobs.

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
KC25m
User
Beiträge: 65
Registriert: Freitag 14. Juli 2006, 12:11
Wohnort: Kassel
Kontaktdaten:

Hallo Leute,
seid ein paar Tagen versuche ich Binärdatein in meine MySQL Datenbank zu speichern.
Diese Daten sind nichts anderes als gepackte cPickle Objekte.

Dazu möchte ich eigentlich die Funktion von mySQL nutzen coursor.execute(Anweisung, Argument).
Leider wird mir dann ständig gesagt, dass die MySQL-Syntax falsch wäre.
Hänge ich aber die Argumente direkt an geht es, ob wohl ich sonst nichts geändert habe.

Code: Alles auswählen

def schreibe(self,name,obj,zeit):   # geht nicht
    p=cPickle.dumps(obj,-1)
    c=zlib.compress(pickledata)
    blob= MySQLdb.escape_string(c)
    sqlargs=(name,zeit,blob)
    CMD="INSERT INTO  %s (zeit,obj) VALUES(%s,'%s');"
    ret=self.execute(CMD,sqlargs)
    return ret
Funktionierender Code.

Code: Alles auswählen

def schreibe(self,name,obj,zeit):       # geht
    p=cPickle.dumps(obj,-1)
    c=zlib.compress(p)
    blob= MySQLdb.escape_string(compressed)
    sqlargs=(name,zeit,blob)
    CMD="INSERT INTO  %s (zeit,obj) VALUES(%s,'%s');"%sqlargs
    ret=self.execute(CMD)
    return ret
Ein weiteres Problem ist,
dass es unter Windows läuft und unter Linux eine decoding error gibt.

Code: Alles auswählen

UnicodeDecodeError: 'ascii' codec can't decode byte 0x9c in position 64: ordinal not in range(128)
Habe das Webauf dem Kopf gestellt und alles mögliche versucht, irgenwie sehe ich den Wald vor lauter Bäume nicht.
Bin daher für jede Hilfe dankbar.

Gruß der KC.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

In der execute-Methode können nur Werte im String ersetzt werden, der Name der Tabelle ist allerdings kein Wert. Diesen musst du per Hand in den Befehl eintragen.

--- EDIT ---

Code: Alles auswählen

sqlargs=(zeit ,blob)
CMD="INSERT INTO  %s (zeit, obj) VALUES(%%s, %%s);" % name
ret=self.execute(CMD, sqlargs) 
---

Unicode-Fehler: Poste mal die ganze Fehlermeldung und den zur Meldung gehörenden Code, dann kann man dir leichter helfen.
Zuletzt geändert von EyDu am Montag 8. Juni 2009, 14:56, insgesamt 3-mal geändert.
Das Leben ist wie ein Tennisball.
BlackJack

@KC25m: Die Platzhalter dürfen nur für Werte verwendet werden, nicht für Tabellennamen, weil die nicht "escaped" werden dürfen, und weil die Datenbank das "escapen" übernimmt, sind beim Blob-Argument die einfachen Anführungszeichen um den Platzhalter zuviel.
KC25m
User
Beiträge: 65
Registriert: Freitag 14. Juli 2006, 12:11
Wohnort: Kassel
Kontaktdaten:

Hallo Ihr,
danke für die schnelle Antwort.
Habe den Code nun abgeändert mit dem doppelten % und den Tabellenname. Der Tabellenname ist kein Wert stimmt, emmm ja dumm ist wer dummes tut und ich tat dummes ^^ danke :)

So habe es gerade im Testlauf unter Linux und es sieht super aus :)
Danke Euch für eure Antwort.
Antworten