GDAL / OGR पायथन बाइंडिंग में PostgreSQL / PostGIS त्रुटियों को कैसे पकड़ें?


10

क्या किसी क्वेरी के विफल होने के बाद OGR में PostgreSQL आउटपुट त्रुटि संदेशों को पकड़ना संभव है?

उदाहरण के लिए

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

पोस्टग्रैज में यह एक त्रुटि संदेश देता है:

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

ओगर में हम मानक प्राप्त करते हैं:

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

यह एक बोनस होगा यदि हम पोस्टग्रेज त्रुटि संदेश को पकड़ / पार्स कर सकते हैं। मुझे संदेह है कि यह एक लंबा-शॉट है जिसे मैंने SWIG / CPL के बारे में पढ़ा है, लेकिन यह देखने के लिए लायक है कि क्या किसी को विचार मिला है। आदर्श रूप से यह पायथन में होगा, लेकिन मैं C / C ++ टिप्पणी भी लूंगा!

धन्यवाद।

जवाबों:


6

आपको GDAL / OGR 1.9.x पर अपग्रेड करना चाहिए जहां 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

यदि आप psycopg2 का उपयोग कर रहे हैं, तो आप निम्न कोड के रूप में "कोशिश" फ़ंक्शन में डालने के साथ आसानी से अपने त्रुटि संदेश को प्रिंट कर सकते हैं। कोड फिर से नहीं लिखने के लिए zetcode.com से लिया गया था ...

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

मुझे उम्मीद है इससे आपको मदद मिली होगी...


धन्यवाद आरागॉन, हाँ Psycopg2 एक महान पुस्तकालय है, लेकिन यह देखने के लिए दिलचस्पी है कि क्या ओगर के माध्यम से कुछ ऐसा ही संभव है। हमें ज्योमेट्री ऑपरेशंस को संभालने के लिए ओगर की जरूरत है और मैं केवल एक अलग एपीआई का उपयोग करने के लिए कनेक्शन की नकल नहीं करूंगा।
टॉमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.