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