sql >> データベース >  >> RDS >> PostgreSQL

psycopg2:カーソルはすでに閉じています

    おそらく、接続が切断された場合は、接続を再確立して、例外ハンドラーで別のカーソルを取得する必要があります。

    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(...) 接続を再確立しようとすると失敗する可能性があるため、それも処理する必要があります。



    1. 生年月日から年齢を取得するMySQLクエリ

    2. mysqlクエリの「IN」句でPHPの値の配列を使用するにはどうすればよいですか?

    3. Drupalhook_submitはdbに書き込みます

    4. pg(0.17.1)のインストール中にエラーが発生し、Bundlerを続行できません