Hi Leute,
hat jemand von euch etwas tiefergehendes PostgreSQL-Wissen ?
Ich komme da nach über 12 Jahren Pause wieder rein und hab da eine
vorgefertigte Datenbank einer Software, die sich ein wenig zickig
anstellt, wenn es darum geht Bilddateien herauszurücken. Ich erspar euch
mal das Lamento üder die Hintergründe, aber ich brauche quasi die in der
DB vorhandenen Bilddateien als Bytearray wieder ganz normal als Bild
ausgegeben mit verändertem Dateinamen.
Mit Copy lässt sich da ja schön was machen, also einfach per shell
psql -c "COPY Bla To Blubb" | xxd neuer Dateiname
Das Bytearray da rausholen und den entstandenen HEX-Dump mit xxd wieder
zu einer gültigen Datei zusammen bauen.
Das SQL, um die Bilddaten überhaput zu bekommen und die Zuordnung, bzw.
Dateinamen und Bildtyp ist etwas komplexer, habe ich aber schon einer
verschachtelten SQL hinbekommen.
Ich will so wenig wie möglich über die Shell machen, das hat gewisse
Gründe, dass die Operation auf einem Produktiven DB-Server möglichst
einfach handhabbar sein soll.
1 | SELECT
|
2 | LastUpdate,
|
3 | NeueZuordnungBildnummer,
|
4 | picblob,
|
5 | pictype,
|
6 | concat( NeueZuordnungBildnummer, \'.\' , pictype ) AS newfilename
|
7 |
|
8 | FROM (
|
9 |
|
10 | SELECT
|
11 | Wanndasletztemalupgedatetwurde AS LastUpdate,
|
12 | NeueZuordnungBildnummer,
|
13 | dings,
|
14 | max( foobar ) , -- Das letzte hochgeladene Bild
|
15 | foo,
|
16 | blablubb,
|
17 | blabla,
|
18 | lower( substring( mime_filename from ( position(\'.\' in mime_filename ) +1 ) ) ) AS pictype, --geht leider nicht anders :-(
|
19 | Bildquelle-Byte-Array AS picblob
|
20 |
|
21 | FROM xxxxxx
|
22 |
|
23 | JOIN, JOIN, JOIN .....
|
24 | ) AS bilder
|
Am geilsten fände ich das ja, wenn ich das obige SQL nochmal in ein COPY
TO wrappen könnte und dann alles in eine
PicExport.sql packen könnte,
dann später per Cron einfach nur noch
psql < PicExport.sql | xxd Ausgabepfad
oder so benutzen könnte.
Problem beim reinen COPY-Befehl ist, dass der einzeln, direkt pro
Datensatz funktioniert. Aber ich kann dem Befehl wohl NUR das Bytea/Blob
mitgeben, keine Informationen über andere Spalten, mit denen ich mir
meinen neuen Dateinamen zusammensetzen könnte.
Ein anderer Ansatz ist, eine Textdatei mit lauter COPYs zu erzeugen und
dann per Shell auszuführen ... das finde ich extrem unsexy und
zusammengespaxt.
Jemand ne Idee ?
THX und Gruß