Bagaimana cara menangkap kesalahan PostgreSQL / PostGIS di binding Python GDAL / OGR?

10

Apakah mungkin untuk menangkap pesan kesalahan keluaran PostgreSQL di OGR setelah kueri gagal?

Sebagai contoh

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

Di Postgres ini mengembalikan pesan kesalahan:

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

Dalam satuan kami mendapatkan standar:

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

Ini akan menjadi bonus jika kita dapat menangkap / mengurai pesan kesalahan Postgres. Saya curiga ini agak sulit mengingat apa yang saya baca tentang SWIG / CPL, tetapi layak untuk bertanya apakah ada yang punya ide. Idealnya ini menggunakan Python, tapi saya akan mengambil komentar C / C ++ juga!

Terima kasih.

Tomas
sumber

Jawaban:

6

Anda harus meningkatkan ke GDAL / OGR 1.9.x di mana pelaporan kesalahan untuk sumber data PostgreSQL telah ditingkatkan:

$ 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...
Bahkan Rouault
sumber
1

jika Anda menggunakan psycopg2, Anda dapat dengan mudah mencetak pesan kesalahan Anda dengan memasukkannya ke dalam fungsi "coba" sebagai kode berikut. kode itu diambil dari zetcode.com karena tidak menulis lagi ...

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

Saya harap ini membantu Anda ...

Aragon
sumber
Terima kasih Aragon, ya Psycopg2 adalah perpustakaan yang hebat, tetapi tertarik untuk melihat apakah sesuatu yang serupa dimungkinkan melalui ogr. Kami membutuhkan ogr untuk menangani operasi geometri dan saya lebih suka tidak menduplikasi koneksi hanya demi menggunakan API yang berbeda.
Tomas