Forum: PC-Programmierung Praxiswissen PostgreSQL Spezialfall Bilddaten


von Der kein Bock mehr A. (Gast)


Lesenswert?

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ß

von Der kein Bock mehr A. (Gast)


Lesenswert?

Hmm, habs jetz doch anders gelöst ... aber wird dann doch zu speziell, 
wie ichs umsetzen will ...

Wenns tatsächlich jemd. interessiert, einfach nochmal melden, sonst : 
Thread ignoreiren

Tschö

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.