Làm cách nào để bắt lỗi PostgreSQL / PostGIS trong các ràng buộc Python GDAL / OGR?


10

Có thể bắt các thông báo lỗi đầu ra PostgreSQL trong OGR sau khi truy vấn không thành công?

Ví dụ

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

Trong Postgres, điều này trả về một thông báo lỗi:

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

Trong ogr, chúng tôi nhận được tiêu chuẩn:

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

Sẽ là một phần thưởng nếu chúng ta có thể bắt / phân tích thông báo lỗi Postgres. Tôi nghi ngờ đây là một chút về những gì tôi đã đọc về SWIG / CPL, nhưng đáng để xem liệu có ai có ý tưởng hay không. Lý tưởng nhất là bằng Python, nhưng tôi cũng sẽ nhận được ý kiến ​​C / C ++!

Cảm ơn.

Câu trả lời:


6

Bạn nên nâng cấp lên GDAL / OGR 1.9.x nơi báo cáo lỗi cho nguồn dữ liệu PostgreSQL đã được cải thiện:

$ 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

nếu bạn đang sử dụng psycopg2, bạn có thể dễ dàng in thông báo lỗi của mình bằng cách đưa nó vào chức năng "thử" như đoạn mã sau. mã được lấy từ zetcode.com vì không viết lại ...

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

Tôi hy vọng nó sẽ giúp bạn...


Cảm ơn Aragon, vâng, Psycopg2 là một thư viện tuyệt vời, nhưng quan tâm xem liệu có thể có thứ gì đó tương tự thông qua ogr hay không. Chúng tôi cần ogr để xử lý các hoạt động hình học và tôi không muốn các kết nối trùng lặp chỉ vì mục đích sử dụng một API khác.
Tomas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.