<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
Ciao Marco.<br>Vedo un'errore di fondo nell'uso del database, di qualunque marca esso sia.<br><br>In pratica stai tentando di modificare l'id della chiave primaria della tabella nazioni "contemporaneamente" al corrispettivo id di chiave esterna della tabella clienti.<br>Semplicemente, non puoi farlo e il problema dipende dal fatto che esiste un legame di foreing-key tra le due tabelle.<br>Dovresti fare così:<br>1. inserire in tabella nazioni la riga con il nuovo id di chiave primaria<br>2. sganciare la chiave esterna della tabella clientiin modo che non punti più alla vecchia chiave primaria e punti alla nuova chiave primaria.<br>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.<br><br>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.<br><br>Per inciso, con SQLite non avresti il problema in quanto le foreign-key sono sì dichiarabili ma non vengono imposte (enforced) al database.<br><br>Saluti.<br>_ Matteo.<br>
<br>> From: marcofoc@libero.it<br>> To: python@lists.python.it<br>> Date: Mon, 25 Oct 2010 00:00:34 +0200<br>> Subject: Re: [Python] [Python e PostgreSQL] All'interno delle eccezioni, le transazioni si comportano diversamente?<br>> <br>> > Grazie per la versione. Vorrei vedere un pezzetto di codice con le<br>> > operazioni che svolgi: la query, l'eccezione, la query *nell'*eccezione...<br>> <br>> update = "UPDATE clienti.nazioni SET "+etichetta+"=%s WHERE<br>> "+etichetta2"=%s;"<br>> <br>> try:<br>>         cur.execute(update, (nuovo_valore, valore_statico))<br>> connDB.commit()<br>> except psycopg2.IntegrityError: <br>> connDB = psycopg2.connect(connessione)<br>> cur = connDB.cursor()<br>> update1 = "UPDATE clienti.anagrafica_clienti SET nazione=%s<br>> WHERE nazione=%s;"<br>> estrai = "SELECT idnazione FROM clienti.nazioni WHERE<br>> nome_nazione = %s;"<br>> cur.execute(estrai, (nome_nazione,))<br>> id_nazione_vecchio = cur.fetchone()<br>> id_nazione_vecchio = id_nazione_vecchio[0]<br>> cur.execute(update1, (nuovo_valore, id_nazione_vecchio,))<br>> update2 = "UPDATE clienti.nazioni SET "+etichetta+"=%s WHERE<br>> "+etichetta2+"=%s;"<br>> cur.execute(update2, (nuovo_valore, valore_statico))<br>> connDB.commit()        <br>> cur.close()<br>> connDB.close() <br>> <br>> Non ho mai postato del codice.. spero non si dovesse far in altra<br>> maniera.<br>> Le varie variabili, sono state dichiarate prima.. ma credo vadano bene<br>> tutte. Il problema è proprio nel primo update. Mi dà errore perchè<br>> cambio ina idnazione non ancora presente nella tabella nazioni..<br>> <br>> Notte.<br>> Marco<br>> <br>> _______________________________________________<br>> Python mailing list<br>> Python@lists.python.it<br>> http://lists.python.it/mailman/listinfo/python<br>                                            </body>
</html>