Donnerstag, 20. November 2008

entwickler.com Magazine Konferenzen Entwickler Akademie Entwickler-Forum Jobbörse Bücher
Software & Support Verlag

BLOBs in MySQL speichern

Vor diesem Problem stehen Entwickler häufiger: Binäre Daten sollen in einer Datenbank abgelegt werden. Obwohl das Ganze nicht weiter schwierig ist, scheint nicht jedem Anwender auf Anhieb klar zu sein, wie man dieses Vorhaben in die Tat umsetzt. Am Beispiel von MySQL und Python soll auf einfache Art und Weise demonstriert werden, wie Sie vorgehen könnten.

Was braucht man für diese Aufgabe? Das RDBMS MySQL muß natürlich installiert sein, ebenso die Programmiersprache Python und last not least das Python-Modul MySQLdb. Dieses Modul von A. Dustman findet man im Netz unter [1].

Das untenstehende Python-Programm speichert eine Grafik (*.jpg) in einer MySQL-Tabelle ab. Anschließend wird testweise dieselbe Grafik aus der Datenbank ausgelesen. Hier ist das Listing:


#!/usr/bin/env python

import MySQLdb

if __name__ == '__main__':

FP = open('pfad/zur/Grafik', 'rb')
con = MySQLdb.connect(host="localhost", user="ich", passwd="geheim", db="bildDB")

bindata = FP.read()

cur = con.cursor()
cur.execute("UPDATE meineTabelle SET bild=%s WHERE id=45", (bindata,)) # Bild einlesen
cur.execute("SELECT bild FROM meineTabelle WHERE id=45") # Bild auslesen

row = cur.fetchone()
retrieved_bindata = row[0]

assert retrieved_bindata == bindata

con.close()
FP.close()

Bevor Sie dieses kleine Programm starten, müssen Sie eine neue Datenbank (inklusive Tabelle) anlegen und die Verbindungsparameter im Programm anpassen. Schauen Sie gegebenenfalls in die MySQL-Dokumentation. Es ist unbedingt darauf zu achten, dass der passende Datentyp für die BLOB-Zeile verwendet wird (zum Beispiel MEDIUMBLOB).

Nun ein paar Worte zum Programm selbst. Zuerst öffnet man eine Bild-Datei (Sie können auch andere binäre Daten verarbeiten) im Binär-Mode ('rb'). Danach muss das Connection-Objekt, die Verbindung zum Server, erzeugt werden. Die zuvor geöffnete Bild-Datei wird jetzt der Variablen bindata zugewiesen.

Mit Hilfe des Connection-Objektes werden zwei Queries an den MySQL-Server abgesetzt. Zuerst wird die Tabelle aktualisiert (das UPDATE-Statement). Die Id in diesem SQL-Statement dient nur zur Veranschaulichung.

Danach wird die Grafik wieder ausgelesen. Die assert-Anweisung vergleicht schließlich beide Dateien. Ist ein Fehler aufgetreten, wird auf der Konsole eine Meldung ausgegeben.

Apropos, BLOB bedeutet nichts weiter als "Binary Large Object". Viel Erfolg beim Probieren.

Thomas Kaufmann

Links:

[1] http://sourceforge.net/projects/mysql-python




Software & Support Verlag GmbH