sql >> Databasteknik >  >> RDS >> PostgreSQL

psycopg2 :markören redan stängd

Om anslutningen har avbrutits måste du förmodligen återupprätta den och få en annan markör i undantagshanteraren:

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

Du bör vara mer specifik med de undantag som du fångar upp. Förutsatt ett InterfaceError undantag om markören är stängd på något sätt kan du fånga det så här:

except psycopg2.InterfaceError as e:

Det kan finnas andra mindre drastiska problem som kommer att hindra efterföljande frågor från att köras, t.ex. transaktionen avbryts. I så fall måste du återställa den aktuella transaktionen och sedan försöka med nästa fråga:

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

Här prövas en fråga mot en icke-existerande tabell. Ett ProgrammingError undantag uppstår och anslutningen måste återställas om en annan fråga ska göras. Den andra frågan bör lyckas.

Detta överskuggar detaljerna om ytterligare undantag som tas upp i själva undantagshanterarna, t.ex.connect(...) kan misslyckas när du försöker återupprätta anslutningen, så du bör hantera det också.



  1. SQL välj alla om parametern är null annars returnerar specifik objekt

  2. Hur man skapar lagrade PL/SQL-procedurer med parametrar i Oracle-databasen

  3. Hur man returnerar ASCII-kodvärdet för en given karaktär i SQL Server

  4. Hur man granskar en PostgreSQL-databas