2010-09-15 21 views
7

Tôi đang chạy lệnh này trong một kịch bản Python:psycopg2.InternalError: làm cách nào để có thêm thông tin hữu ích?

try: 
    print sql_string 
    cursor.execute(sql_string) 
except: 
    print sys.exc_info() 

và nhận được:

(<class 'psycopg2.InternalError'>, InternalError('current transaction is aborted, commands ignored until end of transaction block\n',), <traceback object at 0x1010054d0>) 

Tuy nhiên nếu tôi thử sql_string từ dòng lệnh psql, nó hoạt động tốt. Tôi biết kịch bản đang kết nối với cơ sở dữ liệu ổn, bởi vì tôi có thể chạy các lệnh khác.

Tôi làm cách nào để Python có thể cung cấp cho tôi thông tin hữu ích hơn về lý do tại sao lệnh này bị lỗi trong tập lệnh?

Trả lời

8

Hãy thử điều này:

try: 
    print sql_string 
    cursor.execute(sql_string) 
except Exception, e: 
    print e.pgerror 

Nếu bạn vẫn đang nhận được "giao dịch vãng lai được hủy bỏ, các lệnh bị bỏ qua cho đến khi kết thúc khối giao dịch" thì lỗi của bạn là tiếp tục trở lại trong giao dịch và truy vấn này chỉ là không do truy vấn trước đó không thành công (và do đó làm mất hiệu lực toàn bộ giao dịch).

Các chi tiết cho pgerror có thể được tìm thấy trong các tài liệu tại http://initd.org/psycopg/docs/module.html#exceptions

4

Bạn cũng có thể đuôi đầu ra của postgresql để xem truy vấn gây ra lỗi:

$ tail -f /var/log/postgresql/postgresql.log 

này thường dễ dàng hơn chỉnh sửa kịch bản để gỡ lỗi nó.

+0

Nhìn vào nhật ký, tôi ngay lập tức thấy một bảng khác có lỗi chèn, và điều này đã tạo khối giao dịch. Bảng chèn tôi nghĩ là vấn đề là tốt. – zerocog

Các vấn đề liên quan