Comment détecter les erreurs PostgreSQL / PostGIS dans les liaisons Python GDAL / OGR?

10

Est-il possible d'intercepter les messages d'erreur de sortie PostgreSQL dans OGR après l'échec d'une requête?

Par exemple

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

Dans Postgres, cela renvoie un message d'erreur:

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

Dans l'ogr, nous obtenons la norme:

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

Ce serait un bonus si nous pouvions attraper / analyser le message d'erreur Postgres. Je soupçonne que c'est un peu long compte tenu de ce que j'ai lu sur SWIG / CPL, mais cela vaut la peine de demander si quelqu'un a des idées. Idéalement, ce serait en Python, mais je prendrai aussi les commentaires C / C ++!

Merci.

Tomas
la source

Réponses:

6

Vous devez mettre à niveau vers GDAL / OGR 1.9.x où le rapport d'erreurs pour la source de données PostgreSQL a été amélioré:

$ 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...
Même Rouault
la source
1

si vous utilisez psycopg2, vous pouvez facilement imprimer votre message d'erreur en le mettant dans la fonction "try" comme code suivant. le code provient de zetcode.com pour ne pas avoir réécrit ...

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

J'espère que ça t'aide...

Aragon
la source
Merci Aragon, oui Psycopg2 est une excellente bibliothèque, mais intéressé de voir si quelque chose de similaire est possible via ogr. Nous avons besoin d'ogr pour gérer les opérations de géométrie et je préfère ne pas dupliquer les connexions juste pour le plaisir d'utiliser une API différente.
Tomas