Zunächst einmal danke ich euch für eure freundliche Unterstützung.
Durch die exzellente Hilfe auf der PostgreSQL-Mailing-List und dem PostgreSQL IRC Channel, wurden mir zwei weitere Lösungswege gezeigt, die ich hier kurz für alle erkläre, die vor einem ähnlichen Problem wie ich stehen:
1) Ausgabe über die Kommandozeile mittels psql:
Man erzeugt einen hex-dump der Daten in der BYTEA Spalte "filecontent" aus der Tabelle "pictures" mit psql und transcodiert ihn mit dem Unix-Tool xxd in binäre Daten:
Code:
psql -tAqc "SELECT ENCODE(filecontent, 'hex') FROM pictures LIMIT 1" > picture_hex.txt
xxd -r -p picture_hex.txt > picture.jpg
Die Lösung ist funktioniert gut unter Linux auf dem Client.
Unter einem Client mit Windows fehlt mir das Wissen, wie eine Ausgabe mit Hilfe einer Pipe weiterleitet.
Außerdem habe ich mir nicht die Mühe gemacht, nach einem Tool für Windows zu suchen, das den hex-dump in binäre Daten konvertiert.
2) Export über Binary Large Object (BLOB):
Im Rahmen einer Transaktion wird ein BLOB erzeugt, wohin die Daten aus der BYTEA Spalte geschrieben werden. Anschließend wird dieser BLOB auf den Client exportiert und durch einen Rollback alle Änderungen in der Datenbank mit einem Rollback rückgängig gemacht.
Die Variablen N und F im angegebenen Codebeispiel sind entsprechend der Ausgaben anzupassen:
Code:
begin;
SELECT lo_create(0);
SELECT lo_open(N, 131072); -- N ist hier die Ausgabe von lo_create
SELECT lowrite(F, filecontent) FROM pictures LIMIT 1; -- F ist hierbei die Ausgabe von lo_open
lo_export N TO picture.jpg
rollback;
Die mit 'lowrite' geschriebenen Daten werden mit dem Rollback sehr elegant wieder gelöscht, wogegen die auf dem Client geschiebene Datei vom Rollback unberührt bleibt.
Diese Lösung funktioniert unabhängig vom Betriebssystem des Clients.
Lesezeichen