2 Câu hỏi: Cách truy cập lỗi psycopg2 được bao bọc trong lỗi sqlalchemy

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đang tải khung dữ liệu gấu trúc lên một bảng trong Postgres bằng SQLalchemy và psycopg2. Làm cách nào để truy cập vào lỗi psycopg2 nằm trong lỗi SQLalchemy?

Tôi chỉ muốn viết một ngoại lệ vào mã của mình khi nó phát sinh lỗi do giá trị null trong cột vi phạm ràng buộc không null. Tôi biết cách kiểm tra lỗi pQuery chính xác này với psycopg2, nhưng khi tôi chạy mã của mình, nó sẽ trả về lỗi SQLalchemy.

Đây là lỗi:

  

SQLalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) giá trị null trong cột ...

Đây là ngoại lệ cần thiết:

from sqlalchemy import exc

try:
    df.to_sql(name='sql_table', con=engine, if_exists='append', index=False)
except exc.IntegrityError:

Đây là những gì tôi muốn làm:

from sqlalchemy import exc
import psycopg2

try:
    df.to_sql(name='sql_table', con=engine, if_exists='append', index=False)
except exc.IntegrityError as ex:
    ex = ex.psycopg2error
    if ex.pgcode == '23502'
        print('Data not uploaded: null value in a column violates non-null constraint')
    else:
        raise

Tôi biết tôi có thể kiểm tra sqlalchemy.exc.IntegrityEror.orig, nhưng điều đó không sạch sẽ hay chi tiết như khi sử dụng thành viên pgcode.

    
0
2 Câu trả lời                              2                         

Như bạn đã chỉ ra trong câu hỏi của mình, bạn có thể truy cập ngoại lệ cơ bản do dbapi nêu ra thông qua thuộc tính .orig của ngoại lệ SQLAlchemy.

Bất kỳ ngoại lệ nào được trình điều khiển nêu ra và được truyền qua SQLAlchemy được bao bọc bởi một lớp con của DBAPIError , trong đó tài liệu trạng thái:

  

Đối tượng ngoại lệ được bọc có sẵn trong thuộc tính orig. Nó   loại và thuộc tính là cụ thể triển khai DB-API .

(nhấn mạnh của tôi)

Xem xét các tài liệu psycopg cho cơ sở của họ Error một trong những các thuộc tính họ đặt tên là pgcode:

  

Chuỗi biểu thị mã lỗi được trả về bởi phụ trợ, Không có nếu   Không có sẵn. Mô-đun mã lỗi chứa các hằng ký hiệu   đại diện cho mã lỗi PostgreSQL.

Vì vậy, <sqla_exc>.orig.pgcode có vẻ như nó sẽ nhận được những gì bạn đang theo đuổi, nhưng nếu vì lý do nào đó, psycopg không cung cấp mã của họ ở trạng thái ngoại lệ, đó không thực sự là thứ mà sqlalchemy có thể giải quyết nó cho bạn.

    
2
2019-05-09 00: 47: 07Z

Đây là mã cuối cùng của tôi để tham khảo:

try:
    df.to_sql(name='sql_table', con=engine, if_exists='append', index=False)
except exc.DBAPIError as ex:
    if ex.orig.pgcode == '23502':
        print("Data could not be uploaded to sql_table: " + ex.orig.diag.message_primary)
    else:
        raise
    
1
2019-05-10 15: 22: 15Z
nguồn đặt đây