PostgreSQL Meldungen mit psycopg2 abfangen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
nunatak
User
Beiträge: 17
Registriert: Donnerstag 3. März 2011, 19:42

Hallo,

ich nutze relativ viel psycopg2 um mit Skripten verschiedene Datenbankinteraktionen zu machen. Jetzt hatte ich mal versucht die SQL-Fehlermeldungen abzufangen. Das ist mir leider nicht so richtig gelungen. Ich habe mich an diese Beispiele hier gehalten:
http://initd.org/psycopg/docs/module.ht ... opg2.Error

Kann es sein, dass das mit Python3 so nicht mehr funktioniert? Kann mir jemand ein Beispiel geben wie es gelingt?
BlackJack

@nunatak: Was heisst „nicht so richtig gelungen“? Was hast Du genau gemacht und was ist genau passiert? Ausnahmebehandlung gibt es auch in Python 3 noch und die funktioniert grundsätzlich noch wie in Python 2. Das Beispiel verwendet die Syntax (``as``) die in 2 und 3 funktioniert.
nunatak
User
Beiträge: 17
Registriert: Donnerstag 3. März 2011, 19:42

Habe jetzt nochmal ein bisschen damit rumprobiert. Nach einigen Versuchen bekomme ich jetzt doch die richtigen Fehlermeldungen zurück. Allerdings kommt es dabei zu einem Encoding-Problem:

Code: Alles auswählen

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
psycopg2.ProgrammingError: FEHLER:  Relation \u201eschema.table1\u201c existiert nicht
LINE 1: SELECT * FROM schema.table1 LIMIT 1
                      ^


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
  File "C:\brk\programme\Python33\lib\encodings\cp850.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u201e' in position 18: character maps to <undefined>
BlackJack

@nunatak: *Wobei* kommt es zu dieser Ausnahme? Man kann schlecht helfen wenn man nicht weiss *was* Du da *genau* machst. Zu einer sinnvollen Fehlerbeschreibung gehört der relevante Code, die komplette Ausnahme samt Traceback, oder falls es keine Ausnahme gibt, eine Beschreibung des beobachteten Verhaltens und wie das vom erwarteten Verhalten abweicht. Ideal wäre es genug Informationen zu haben, dass jeder der mit liest, das einfach bei sich selbst nachstellen kann.
nunatak
User
Beiträge: 17
Registriert: Donnerstag 3. März 2011, 19:42

Sorry, da hast du natürlich Recht!

Habe das vorhin in der virtuellen Umgebung ausprobiert:

Code: Alles auswählen

>>> query = "SELECT * FROM schema.table1 LIMIT 1"
>>> try:
...     cur.execute(query)
...     rows = cur.fetchall()
... except psycopg2.Error as e:
...     print(e.pgerror)
...
Die Unicode Encoding Fehler entstehen anscheinend erst wenn der Fehlerstring zurückgegeben wird. Eine funktionfähige Query liefert ganz normal ein gültiges Ergebnis.
Prinzipiell funktioniert jetzt also das Auslesen der Postgres-Fehler. Ich hatte den Post zunächst eröffnet, da nach dem try/except die Variablen e.pgerror und e.pgcode nicht belegt waren wenn ich es wie im Beispiel verwende:

Code: Alles auswählen

>>> try:
...     cur.execute("SELECT * FROM barf")
... except psycopg2.Error as e:
...     pass
e ist nur innerhalb des excepts verfügbar. Erst mit dieser Anweisung war es auch danach noch abrufbar:

Code: Alles auswählen

>>> try:
...     cur.execute("SELECT ednx FROM hk.gebref LIMIT 1")
...     rows = cur.fetchall()
... except psycopg2.Error as e:
...     a = e
...
>>> a.pgerror
'FEHLER:  aktuelle Transaktion wurde abgebrochen, Befehle werden bis zum Ende der Transaktion ignoriert\n'
Wobei hier die richtige Fehlermeldung eigentlich "FEHLER: Spalte „ednx“ existiert nicht" sein müsste.
Antworten