Wie kann man PostgreSQL / PostGIS-Fehler in GDAL / OGR-Python-Bindungen abfangen?

10

Ist es möglich, PostgreSQL-Ausgabefehlermeldungen in OGR abzufangen, nachdem eine Abfrage fehlgeschlagen ist?

Zum Beispiel

conn.ExecuteSQL('SELECT * FROM non_existing_table;')

In Postgres wird eine Fehlermeldung zurückgegeben:

"Error: relation 'non_existing_table' does not exist."

In ogr bekommen wir den Standard:

"Error: current transaction is aborted, commands ignored until end of transaction block"

Es wäre ein Bonus, wenn wir die Postgres-Fehlermeldung abfangen / analysieren könnten. Ich vermute, dass dies angesichts der Informationen zu SWIG / CPL ein bisschen langwierig ist, aber es lohnt sich zu fragen, ob jemand Ideen hat. Idealerweise wäre dies in Python, aber ich werde auch C / C ++ - Kommentare aufnehmen!

Vielen Dank.

Tomas
quelle

Antworten:

6

Sie sollten ein Upgrade auf GDAL / OGR 1.9.x durchführen, bei dem die Fehlerberichterstattung für die PostgreSQL-Datenquelle verbessert wurde:

$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from osgeo import ogr
>>> ogr.UseExceptions()
>>> ds = ogr.Open('pg:dbname=autotest')
>>> ds.ExecuteSQL("SELECT * FROM non_existing_table")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/dist-packages/osgeo/ogr.py", line 699, in ExecuteSQL
    return _ogr.DataSource_ExecuteSQL(self, *args, **kwargs)
RuntimeError: ERREUR:  la relation « non_existing_table » n'existe pas
LINE 1: DECLARE executeSQLCursor CURSOR for SELECT * FROM non_existi...
Sogar Rouault
quelle
1

Wenn Sie psycopg2 verwenden, können Sie Ihre Fehlermeldung einfach ausdrucken, indem Sie sie wie folgt in die Funktion "try" versetzen. Der Code wurde von zetcode.com übernommen, weil er nicht mehr geschrieben wurde ...

#!/usr/bin/python
# -*- coding: utf-8 -*-

import psycopg2
import sys


con = None

try:

    con = psycopg2.connect(database='testdb', user='janbodnar') 
    cur = con.cursor()
    cur.execute('SELECT version()')          
    ver = cur.fetchone()
    print ver    


except psycopg2.DatabaseError, e:
    print 'Error %s' % e    
    sys.exit(1)


finally:

    if con:
        con.close()

ich hoffe es hilft dir ...

Aragon
quelle
Danke Aragon, ja, Psycopg2 ist eine großartige Bibliothek, aber interessiert zu sehen, ob etwas Ähnliches über ogr möglich ist. Wir brauchen ogr, um Geometrieoperationen zu handhaben, und ich möchte Verbindungen lieber nicht duplizieren, nur um eine andere API zu verwenden.
Tomas