Có lẽ nếu kết nối bị ngắt, bạn sẽ cần thiết lập lại nó và lấy một con trỏ khác trong trình xử lý ngoại lệ:
for query in queries:
try:
cursor.execute(query)
except Exception as e:
print e.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
Bạn nên cụ thể hơn với các trường hợp ngoại lệ mà bạn bắt được. Giả sử một InterfaceError
ngoại lệ nếu con trỏ bị đóng bằng cách nào đó, bạn có thể thấy như thế này:
except psycopg2.InterfaceError as e:
Có thể có các vấn đề khác ít nghiêm trọng hơn sẽ ngăn không cho các truy vấn tiếp theo thực thi, ví dụ:giao dịch bị hủy bỏ. Trong trường hợp đó, bạn cần khôi phục giao dịch hiện tại và sau đó thử truy vấn tiếp theo:
queries = ['select count(*) from non_existent_table', 'select count(*) from existing_table']
for query in queries:
try:
cursor.execute(query)
except psycopg2.ProgrammingError as exc:
print exc.message
conn.rollback()
except psycopg2.InterfaceError as exc:
print exc.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
Ở đây, một truy vấn được thử đối với một bảng không tồn tại. A ProgrammingError
ngoại lệ được đưa ra và kết nối phải được khôi phục nếu muốn thực hiện một truy vấn khác. Truy vấn thứ hai sẽ thành công.
Điều này làm sáng tỏ các chi tiết của các ngoại lệ khác được nêu ra trong chính các trình xử lý ngoại lệ, ví dụ:connect(...)
có thể không thành công khi cố gắng thiết lập lại kết nối, vì vậy bạn cũng nên xử lý điều đó.