おそらく、接続が切断された場合は、接続を再確立して、例外ハンドラーで別のカーソルを取得する必要があります。
for query in queries:
try:
cursor.execute(query)
except Exception as e:
print e.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
キャッチした例外を除いて、より具体的にする必要があります。 InterfaceError
を想定 例外として、カーソルが何らかの理由で閉じている場合は、次のようにキャッチできます。
except psycopg2.InterfaceError as e:
後続のクエリの実行を妨げる、それほど深刻ではない問題が他にもある可能性があります。トランザクションは中止されます。その場合、現在のトランザクションをロールバックしてから、次のクエリを試す必要があります:
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()
ここでは、存在しないテーブルに対してクエリが試行されます。 ProgrammingError
例外が発生し、別のクエリを試行する場合は接続をロールバックする必要があります。 2番目のクエリは成功するはずです。
これは、例外ハンドラ自体で発生するその他の例外の詳細を詳しく説明しています。例:connect(...)
接続を再確立しようとすると失敗する可能性があるため、それも処理する必要があります。