[Python] [Python e PostgreSQL] All'interno delle eccezioni, le transazioni si comportano diversamente?

Marco Fochesato marcofoc a libero.it
Mar 26 Ott 2010 21:22:56 CEST


On Mon, 2010-10-25 at 22:17 +0200, Marco Fochesato wrote:
> Testato, passa anche da me nel mio database.
> Ma ci voglio capire qualcosa di pił....
> Ciao intanto. 

Allora, siccome l'esempio di Daniele non riproduceva il mio errore.. ho
cambiato il programmino generando il MIO errore, quello della foreign
key.. mi dą errore anche fuori dall'eccezione. Ho provato a lanciare gli
execute senza il try.. 
E' evidente che sbaglio qualcosa io.. qualcosa di tremendamente banale..
lo posto comunque (ps: devo ancora andare a vedere i consigli di
Giovanni e Daniele, ho voluto solo approfondire l'esempio):

import psycopg2
    
def test(dsn):    
    """test if a connection created in an exception handler goes
autocommit"""
    cnn = psycopg2.connect(dsn)
    cur = cnn.cursor()

    cur.execute("""drop table if exists clienti;""")
    cur.execute("""drop table if exists nazioni;""")
    cur.execute("""create table nazioni (idnazione int primary key);
insert
into nazioni values (1);""")
    cur.execute("""CREATE TABLE clienti
(
  nazione integer primary key,
  CONSTRAINT clienti_nazione_fkey FOREIGN KEY (nazione)
      REFERENCES nazioni (idnazione) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
); insert into clienti values (1);""")
    
    cnn.commit()

    # make an error
    try:
        cur.execute("""update nazioni set idnazione = 2 WHERE idnazione
= 1""")
    except psycopg2.IntegrityError:
        # connection created in the handler
        cnn2 =  psycopg2.connect(dsn)
        cur2 = cnn2.cursor()
        cur2.execute("""update clienti set nazione = 2 where nazione =
1""")
        cur2.execute("""update nazioni set idnazione = 2 WHERE idnazione
= 1""")
        cnn2.commit()
    
test("dbname=test")



Maggiori informazioni sulla lista Python