Jak wyłapać błędy PostgreSQL / PostGIS w powiązaniach Pythona w GDAL / OGR?

10

Czy można złapać komunikaty o błędach wyjściowych PostgreSQL w OGR po nieudanym zapytaniu?

Na przykład

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

W Postgres zwraca komunikat o błędzie:

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

W ogrodach otrzymujemy standard:

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

Byłby to bonus, gdybyśmy mogli złapać / przeanalizować komunikat o błędzie Postgres. Podejrzewam, że to trochę długa perspektywa, biorąc pod uwagę to, co przeczytałem o SWIG / CPL, ale warto zapytać, czy ktoś ma jakieś pomysły. Idealnie byłoby to w Pythonie, ale wezmę również komentarze C / C ++!

Dzięki.

Tomas
źródło

Odpowiedzi:

6

Powinieneś uaktualnić do GDAL / OGR 1.9.x, gdzie poprawiono raportowanie błędów dla źródła danych PostgreSQL:

$ 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...
Nawet Rouault
źródło
1

jeśli używasz psycopg2, możesz łatwo wydrukować komunikat o błędzie, wprowadzając go do funkcji „try” jako następujący kod. kod został pobrany z zetcode.com za ponowne pisanie ...

#!/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()

Mam nadzieję, że Ci to pomoże...

Aragonia
źródło
Dzięki Aragon, tak Psycopg2 to świetna biblioteka, ale chciałbym sprawdzić, czy coś podobnego jest możliwe za pośrednictwem ogr. Potrzebujemy ogr do obsługi operacji geometrii i wolałbym nie powielać połączeń tylko ze względu na użycie innego API.
Tomas