PDF als bytea in Postgres-DB einfügen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Ah, ok ... das wusste ich nicht. Vielen Dank!! Jetzt scheint es auch zu funktionieren!

Leider hab ich jetzt noch ein Problem mit der Zeile:

Code: Alles auswählen

with open ("/home/user/mypdf.pdf","rb") as f:
da ich mit Python 2.5.2 arbeite und bekomme deshalb folgende Fehlermeldung:

Code: Alles auswählen

Warning: 'with' will become a reserved keyword in Python 2.6
  File "meinprogramm.py", line 71
    with open ("/home/user/meinpdf.pdf","rb") as f:
            ^
SyntaxError: invalid syntax
Da es sich um einen Server im laufenden Betrieb handelt, habe ich gerade kurzfristig auch nicht die Möglichkeit, die Python-Version zu aktuallisieren. Gibts da eine Möglichkeit, die auch unter 2.5.2 lauffähig ist?
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

Code: Alles auswählen

from __future__ import with_statement
Damit holst du dir das für 2.6 geplante feature (sagt ja deine Fehlermeldung) auf 2.5
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Super, das war genau das, was ich gesucht hatte! Vielen Dank!!!

Jetzt funktioniert auch alles. Vielen Dank nochmal an alle, die mir geholfen haben!
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Ah, eine Sache bereitet mir doch noch ein Problem: Die Datei soll als base64 in die Datenbank geschrieben werden. Mein Versuch war:

Code: Alles auswählen

        with open ("/home/user/mypdf.pdf","rb") as f:
                filedata = f.read().decode("base64")
Hat aber leider nicht geklappt. Fehlermeldung gabs keine, aber beim Öffnen der Datei gibs der Acrobat Reader eine Fehlermeldung aus.

Hab ich das so richtig gemacht?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

andi24 hat geschrieben: Hat aber leider nicht geklappt. Fehlermeldung gabs keine, aber beim Öffnen der Datei gibs der Acrobat Reader eine Fehlermeldung aus.
Naja, Du musst das ja beim Auslesen ja wohl auch wieder zurückwandeln - der Acrobat Reader kann doch bestimmt kein Base64 codiertes Dokument lesen, oder?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Hyperion hat geschrieben: Naja, Du musst das ja beim Auslesen ja wohl auch wieder zurückwandeln - der Acrobat Reader kann doch bestimmt kein Base64 codiertes Dokument lesen, oder?
Ne, klar - hier wird auch ein anderes Programm verwendet (nicht in Python geschrieben), das das pdf wieder aus der Datenbank liest, base64-encodiert und dann den Acrobat Reader das Dokument öffnen lässt. Meine Baustelle wär aber nur, das Dokument ordentlich als base64-pdf in die DB zu schreiben...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

andi24 hat geschrieben: Ne, klar - hier wird auch ein anderes Programm verwendet (nicht in Python geschrieben), das das pdf wieder aus der Datenbank liest, base64-encodiert und dann den Acrobat Reader das Dokument öffnen lässt. Meine Baustelle wär aber nur, das Dokument ordentlich als base64-pdf in die DB zu schreiben...
Ok, dennoch müsste man ja evaluieren, wo der Fehler liegt! Und imho bist Du da noch nicht so weit. Insofern würde ich erst einmal manuell die Umwandlung innerhalb von Python nach base64 und zurück vornehmen und prüfen, ob das Dokument identisch ist (md5sum) und sich öffnen lässt (was dann logischer Schluss wäre).

Danach mit dem Zwischenschritt Datenbank - wenn Ihr es eh base64 codiert in die DB speichert, wozu dann eigentlich diese Binary-Verrenkung? Dank base64 wäre das doch eigentlich als normaler Text speicherbar?!?

Wenn das auch noch klappt, musst Du mal wohl oder übel den Code vom auslesenden Programm angucken und prüfen, was das genau tut. Denn dann liegt der Fehler wohl beim Auslesen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Ah stimmt, das Problem war einfach, dass ich decode statt encode benutzt hatte. Jetzt funktionierts und damit ist das Thema aber wirklich geschlossen :-) Nochmals vielen Dank euch allen!!
Antworten