วิธีการจับข้อผิดพลาด PostgreSQL / PostGIS ในการผูก GDAL / OGR Python?


10

เป็นไปได้หรือไม่ที่จะจับข้อความแสดงข้อผิดพลาดเอาต์พุต PostgreSQL ใน OGR หลังจากแบบสอบถามล้มเหลว

ตัวอย่างเช่น

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

ใน Postgres สิ่งนี้จะส่งคืนข้อความแสดงข้อผิดพลาด:

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

ใน ogr เราได้มาตรฐาน:

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

มันจะเป็นโบนัสถ้าเราสามารถจับ / แยกวิเคราะห์ข้อความแสดงข้อผิดพลาดของ Postgres ได้ ฉันสงสัยว่านี่เป็นช็อตเล็กน้อยที่ได้รับจากสิ่งที่ฉันได้อ่านเกี่ยวกับ SWIG / CPL แต่ก็คุ้มค่าที่จะถามว่าใครมีไอเดียไหม เป็นการดีที่จะเป็น Python แต่ฉันจะแสดงความคิดเห็น 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()

ฉันหวังว่ามันจะช่วยคุณ ...


ขอบคุณ Aragon ใช่ Psycopg2 เป็นห้องสมุดที่ยอดเยี่ยม แต่สนใจที่จะดูว่ามีอะไรที่คล้ายกันผ่าน ogr ไหม เราต้องการ ogr เพื่อจัดการกับการทำงานของรูปทรงเรขาคณิตและฉันไม่ต้องการเชื่อมต่อที่ซ้ำกันเพียงเพื่อการใช้ API ที่แตกต่างกัน
โทมัส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.