Seite 1 von 1

Probleme mit MySQL, Syntax und senden von Blobs.

Verfasst: Montag 8. Juni 2009, 14:46
von KC25m
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.

Verfasst: Montag 8. Juni 2009, 14:53
von EyDu
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.

Verfasst: Montag 8. Juni 2009, 14:56
von 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.

Verfasst: Montag 8. Juni 2009, 15:16
von KC25m
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.