GDAL / OGR Python bağlarında PostgreSQL / PostGIS hataları nasıl yakalanır?


10

Bir sorgu başarısız olduktan sonra OGR'de PostgreSQL çıktı hata mesajlarını yakalamak mümkün mü?

Örneğin

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

Postgres'de bu bir hata mesajı döndürür:

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

Ogr olarak standardı alıyoruz:

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

Postgres hata mesajını yakalayabilir / ayrıştırabilirsek bir bonus olurdu. SWIG / CPL hakkında okuduğum şey göz önüne alındığında, bunun uzun bir atış olduğundan şüpheleniyorum, ancak kimsenin fikirleri olup olmadığını sormaya değer. İdeal olarak bu Python olurdu, ama ben de C / C ++ yorumları alacağım!

Teşekkürler.

Yanıtlar:


6

PostgreSQL veri kaynağı için hata bildiriminin iyileştirildiği GDAL / OGR 1.9.x sürümüne yükseltmelisiniz:

$ 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

psycopg2 kullanıyorsanız, hata mesajınızı aşağıdaki kod gibi "dene" işlevine koyarak kolayca yazdırabilirsiniz. kod tekrar yazılmadığı için zetcode.com'dan alındı ...

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

umarım sana yardımcı olur ...


Teşekkürler Aragon, evet Psycopg2 harika bir kütüphanedir, ancak benzer bir şeyin ogr aracılığıyla mümkün olup olmadığını görmekle ilgilenir. Geometri işlemlerini yürütmek için ogr'a ihtiyacımız var ve sadece farklı bir API kullanmak adına bağlantıları çoğaltmamayı tercih ederim.
Tomas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.