Come rilevare gli errori PostgreSQL / PostGIS negli attacchi Python GDAL / OGR?


10

È possibile rilevare i messaggi di errore di output PostgreSQL in OGR dopo che una query non è riuscita?

Per esempio

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

In Postgres questo restituisce un messaggio di errore:

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

In ogr otteniamo lo standard:

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

Sarebbe un vantaggio se potessimo catturare / analizzare il messaggio di errore di Postgres. Ho il sospetto che questo sia un po 'lungimirante dato quello che ho letto su SWIG / CPL, ma vale la pena chiedere di vedere se qualcuno ha idee. Idealmente questo sarebbe in Python, ma prenderò anche i commenti C / C ++!

Grazie.

Risposte:


6

È necessario eseguire l'aggiornamento a GDAL / OGR 1.9.x dove è stata migliorata la segnalazione degli errori per l'origine dati 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...

1

se stai usando psycopg2, puoi facilmente stampare il tuo messaggio di errore inserendolo nella funzione "prova" come il seguente codice. il codice è stato preso da zetcode.com per non aver più scritto ...

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

spero che ti aiuti ...


Grazie Aragona, sì Psycopg2 è un'ottima libreria, ma sono interessato a vedere se qualcosa di simile è possibile tramite ogr. Abbiamo bisogno di Og per gestire le operazioni di geometria e preferirei non duplicare le connessioni solo per il gusto di usare un'API diversa.
Tomas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.