如何在GDAL / OGR Python绑定中捕获PostgreSQL / PostGIS错误?


10

查询失败后是否可以在OGR中捕获PostgreSQL输出错误消息?

例如

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 ++注释!

谢谢。

Answers:


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,则可以按照以下代码将其放入“ try”函数中,从而轻松打印错误消息。该代码来自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而复制连接。
托马斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.