[Python] psycopg, cursori e connessioni: tenere occupato un id

Marco Fochesato marcofoc a libero.it
Lun 16 Maggio 2011 22:01:13 CEST


> Non ci dici questa chiave primaria di che tipo è e che valori assume.
Scusami. Certo, è un numero intero.
> 
> Inoltre, che intendi con "prenota"?
Ipotizzando che esistano due tabelle:
progressivi_documenti (id_doc, data_doc, causale, id_cliente, etc..)
struttura_documenti(prog_riga, id_doc, descrizione, um, quantita,
etc...)
(ho semplificato eh)

prenotare l'd significa fare un insert sulla prima tabella, senza il
commit e poter lavorare sulla seconda tabella.
La seconda tabella è referenziata alla prima tramite id_doc.
Agli inserimenti, il database pretende che ci sia l'id inserito nella
prima.
Ma se l'utente dovesse annullare l'inserimento, non mi deve rimanere
l'id inserito nella prima.


> Allora, *assumendo* che questo id sia essenzialmente un intero per cui
> un DDT debba avere un id maggiore di quello precedente, la soluzione più
> semplice che mi viene in mente è quella di utilizzare la serializzazione
> del database:
> http://www.postgresql.org/docs/9.0/interactive/transaction-iso.html#XACT-SERIALIZABLE
> 
> 
> In pratica, puoi creare una tabella `ddt_id` dove memorizzare l'"ultimo"
> ID utilizzato.
> 
> CREATE TABLE ddt_id (
>     ddt_id INTEGER NOT NULL PRIMARY KEY;
> );
> 
> Quindi, all'interno di una transazione serializzabile:
> 1) SELECT dell'ultimo ID inserito dalla tabella `ddt_id`
> 2) UPDATE sulla tabella `ddt_id` per incrementare l'ID
> 3) Usare l'ID incrementato nel DDT
> 4) COMMIT
> 
> A questo punto se un altra transazione ha cercato di fare l'UPDATE sulla
> tabella `ddt_id`, riceverai un errore (solo il primo commit riuscirà).
> 
Rispondo senza aver letto il link:
siamo sicuri che l'update possa generare un errore?
Credo che l'update possa essere tipo:
"UPDATE progressivi_documenti SET id_doc = id_doc+1"
come fa a generare un errore?
Non mi è chiaro, magari leggendo il link capisco.


> 
> Tra l'altro l'idea di avere una tabella che contiene una sola riga non
> mi convince molto...
Parli della TUA tabella vero?





Maggiori informazioni sulla lista Python