sql >> Database teknologi >  >> RDS >> PostgreSQL

psycopg2 :markøren er allerede lukket

Hvis forbindelsen er faldet, skal du formentlig genetablere den og få en anden markør i undtagelsesbehandleren:

for query in queries:
    try:
        cursor.execute(query)
    except Exception as e:
        print e.message
        conn = psycopg2.connect(....)
        cursor = conn.cursor()

Du bør være mere specifik med de undtagelser, du fanger. Forudsat en InterfaceError undtagelse, hvis markøren på en eller anden måde er lukket, kan du fange det sådan her:

except psycopg2.InterfaceError as e:

Der kan være andre mindre drastiske problemer, der vil forhindre efterfølgende forespørgsler i at udføre, f.eks. transaktionen afbrydes. I så fald skal du rulle den aktuelle transaktion tilbage og derefter prøve den næste forespørgsel:

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()

Her forsøges en forespørgsel mod en ikke-eksisterende tabel. En ProgrammingError undtagelse er rejst, og forbindelsen skal rulles tilbage, hvis en anden forespørgsel skal forsøges. Den anden forespørgsel skulle lykkes.

Dette udviser detaljerne om yderligere undtagelser, der rejses i selve undtagelsesbehandlerne, f.eks.connect(...) kan mislykkes, når du forsøger at genetablere forbindelsen, så du bør også håndtere det.



  1. Effektivitet af kvartalsvis beregning af antal ansatte

  2. PDO får brøkdele sekunder fra Postgres

  3. INSERT trigger for at indsætte post i samme tabel

  4. Filtrering af MySQL-forespørgsel i PHP