Blob wird nicht in die DB geschrieben

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
campino
User
Beiträge: 5
Registriert: Montag 7. Dezember 2009, 07:30

Guten morgen zusammen,

ich programmiere gerade eine Webanwendung mit Python und MySQLdb. Nun möchte ich gerne ein paar Files direkt in der Datenbank als BLOB speichern. nur habe ich das Problem, dass das ganze nciht so will wie ich das will.

Vorgehensweise:

1. Upload der Datei auf den Server (funktioniert)
2. einlesen der Datei als Binary (funktioniert)
3. Erstellen des MySQL insert befehls (funktioniert)
4. ausführen des Insert Befehls (funktioniert nicht)

Code: Alles auswählen

ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\x0e\x8f\xd1Z\x7f\x1e\x7fRD\xba\xf5uW\xbdj\x7fr\\$\x97\xa1\x04\xb3ju\x17\x0e\xeeT\xe7\xa8\xff' at line 1")
das kommt beim einfügen in die DB als Fehler. das Escapen der "\" habe ich auch schon versucht einmal mit MySQLdb.Binary() oder auch mit MySQLdb.escape_string bzw auf die holzhammermethode bin.replace("\\","\\\\")

Das hat aber leider alles nicht funktionert. Ich hänge hier nun schon seit donnerstag fest und weiß nicht mher weiter.

Die Dateien die gespeichert werden sollen sind entweder jpg, png oder pdf falls das was zur ache tut.

Vielen Dank für eure Hlfe

Gruß
Alexander
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

http://www.felix-benner.com
campino
User
Beiträge: 5
Registriert: Montag 7. Dezember 2009, 07:30

hmm das habe ich auch schon probiert gehabt

Code: Alles auswählen

"INSERT INTO `release`.`attachment` (`ID`, `filename`, `mimetype`, `data`) VALUES (NULL, 'test', 'image/jpeg', '<binarydata>');"
das hier ist mein SQL statement welches ich ausführen möchte.

wenn ich das jetzt mit

Code: Alles auswählen

cursor.execute("INSERT INTO `release`.`attachment` (`ID`, `filename`, `mimetype`, `data`) VALUES (NULL, '" + str(fn[0]) + "', '" + str(m[0]) + "', '%s');", bin)
bzw auch mit

Code: Alles auswählen

cursor.execute("INSERT INTO `release`.`attachment` (`ID`, `filename`, `mimetype`, `data`) VALUES (NULL, '" + str(fn[0]) + "', '" + str(m[0]) + "', '%r');", bin)
ausführe erhalte ich den selben Fehler
Zuletzt geändert von campino am Montag 7. Dezember 2009, 10:58, insgesamt 1-mal geändert.
campino
User
Beiträge: 5
Registriert: Montag 7. Dezember 2009, 07:30

ich glaube ich kann den Fehler etwas einschränken. Er scheint nur bei dateinen aufzutreten welche ungefähr über vierKiB groß sind (ob die grenze genau bei vier KiB liegt kann ich nicht genau sagen) gibt es dort irgendwo bei mySQL oder Python eine Einstellung dafür?

ich kann auch die größeren Dateiein nciht mehr fehlerfrei auslesen. die danach erstellten Dateien sind alle nur noch genau 4.096 Bytes groß der Rest fehlt einfach...
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

Schein ein mysql Problem zu sein.
http://www.felix-benner.com
campino
User
Beiträge: 5
Registriert: Montag 7. Dezember 2009, 07:30

hmmm ok und wie kann ich das beheben bzw. ändern??

//Edit
macht es einen unterschied, dass das Feld in der DB ein LONGBLOB ist?

//Edit2

hier ist die Lösung für mein Problem zumindest was die inserts angeht (selects hab ich noch nicht testen können)
http://mail.python.org/pipermail/python ... 39172.html
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich würde vorschlagen auf Blobs zu verzichten und nur Links auf ein Dateisystem zu speichern :-)
campino
User
Beiträge: 5
Registriert: Montag 7. Dezember 2009, 07:30

dass man die dateinen normalerweise im filesystem speichern sollte ist mir an sich schon klar nur müssen die daten hier auf 7 verschiedenen Servern bereitstehen und die datenbank wird schon überallhin repliziert und die Filestruktur müsste ich erst wieder als synchronisation einrichten von demher ist das so der einfachere Weg und es funktioniert ja jetzt
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

campino hat geschrieben:dass man die dateinen normalerweise im filesystem speichern sollte ist mir an sich schon klar nur müssen die daten hier auf 7 verschiedenen Servern bereitstehen und die datenbank wird schon überallhin repliziert und die Filestruktur müsste ich erst wieder als synchronisation einrichten von demher ist das so der einfachere Weg und es funktioniert ja jetzt
Hm, ja, heterogene und gewachsene Strukturen sind da natürlich ein Problem :-)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn es keine SQL-Datenbank sein muss: http://couchdb.apache.org.

Da sind Attachments total easy going und werden zusätzlich auch noch revisioniert. :-)

Gruß, noisefloor
Antworten