¿Cómo detectar errores de PostgreSQL / PostGIS en enlaces de Python GDAL / OGR?

10

¿Es posible detectar mensajes de error de salida de PostgreSQL en OGR después de que una consulta haya fallado?

Por ejemplo

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

En Postgres esto devuelve un mensaje de error:

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

En ogr obtenemos el estándar:

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

Sería una ventaja si pudiéramos atrapar / analizar el mensaje de error de Postgres. Sospecho que esto es un poco arriesgado dado lo que he leído sobre SWIG / CPL, pero vale la pena preguntar si alguien tiene ideas. Idealmente, esto sería en Python, ¡pero también tomaré comentarios C / C ++!

Gracias.

Tomás
fuente

Respuestas:

6

Debe actualizar a GDAL / OGR 1.9.x donde se ha mejorado el informe de errores para la fuente de datos 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...
Incluso Rouault
fuente
1

si está utilizando psycopg2, puede imprimir fácilmente su mensaje de error poniéndolo en la función "probar" como el siguiente código. el código fue tomado de zetcode.com por no volver a escribir ...

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

Espero que te ayude...

Aragón
fuente
Gracias Aragón, sí Psycopg2 es una gran biblioteca, pero está interesado en ver si algo similar es posible a través de ogr. Necesitamos ogr para manejar las operaciones de geometría y prefiero no duplicar las conexiones solo por el uso de una API diferente.
Tomás