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

Matteo Mattsteel Vitturi mattsteel a hotmail.it
Lun 25 Ott 2010 10:45:46 CEST


Ciao Marco.
Vedo un'errore di fondo nell'uso del database, di qualunque marca esso sia.

In pratica stai tentando di modificare l'id della chiave primaria della tabella nazioni "contemporaneamente" al corrispettivo id di chiave esterna della tabella clienti.
Semplicemente, non puoi farlo e il problema dipende dal fatto che esiste un legame di foreing-key tra le due tabelle.
Dovresti fare così:
1. inserire in tabella nazioni la riga con il nuovo id di chiave primaria
2. sganciare la chiave esterna della tabella clientiin modo che non punti più alla vecchia chiave primaria e punti alla nuova chiave primaria.
3. (tentare di) cancellare la riga della vecchia chiave primaria. Dico "tentare" perché potresti non riuscirci in quanto potresti aver dimenticato di sganciare una riga di clienti.

L'alternativa potrebbe essere quella di disabilitare per un momento il vincolo di foreign-key, effettuare i due update (come dici tu nel tuo pezzetto di codice) ed infine riattivare la foreign-key... e qui potresti non riuscirci... perché è successo qualcosa nel frattempo.

Per inciso, con SQLite non avresti il problema in quanto le foreign-key sono sì dichiarabili ma non vengono imposte (enforced) al database.

Saluti.
_ Matteo.


> From: marcofoc a libero.it
> To: python a lists.python.it
> Date: Mon, 25 Oct 2010 00:00:34 +0200
> Subject: Re: [Python] [Python e PostgreSQL] All'interno delle eccezioni, le transazioni si comportano diversamente?
> 
> > Grazie per la versione. Vorrei vedere un pezzetto di codice con le
> > operazioni che svolgi: la query, l'eccezione, la query *nell'*eccezione...
> 
> update = "UPDATE clienti.nazioni SET "+etichetta+"=%s WHERE
> "+etichetta2"=%s;"
> 
> try:
> 	cur.execute(update, (nuovo_valore, valore_statico))
>         connDB.commit()
> except psycopg2.IntegrityError:          
>         connDB = psycopg2.connect(connessione)
>         cur = connDB.cursor()
>         update1 = "UPDATE clienti.anagrafica_clienti SET nazione=%s
> WHERE nazione=%s;"
>         estrai = "SELECT idnazione FROM clienti.nazioni WHERE
> nome_nazione = %s;"
>        cur.execute(estrai, (nome_nazione,))
>        id_nazione_vecchio = cur.fetchone()
>        id_nazione_vecchio = id_nazione_vecchio[0]
>        cur.execute(update1, (nuovo_valore, id_nazione_vecchio,))
>        update2 = "UPDATE clienti.nazioni SET "+etichetta+"=%s WHERE
> "+etichetta2+"=%s;"
>        cur.execute(update2, (nuovo_valore, valore_statico))
>        connDB.commit()	
>        cur.close()
>        connDB.close()            
> 
> Non ho mai postato del codice.. spero non si dovesse far in altra
> maniera.
> Le varie variabili, sono state dichiarate prima.. ma credo vadano bene
> tutte. Il problema è proprio nel primo update. Mi dà errore perchè
> cambio ina idnazione non ancora presente nella tabella nazioni..
> 
> Notte.
> Marco
> 
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
 		 	   		  
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: http://lists.python.it/pipermail/python/attachments/20101025/86104f3e/attachment.htm 


Maggiori informazioni sulla lista Python