PDA

View Full Version : [python, elixir, sqlalchemy] session.flush - dubbi


mad_hhatter
21-05-2008, 13:54
ciao, sto studiando elixir e facendo un po' di test e sono sorti un po' di dubbi.

andiamo per ordine:

ho una classe A(Entity) avevte chiave primaria 'id'.

creo due istanze di A con lo stesso id (lo so, è stupido, ma sto facendo dei test).

quando invoco sessio.flush() ottengo un sqlalchemy.exceptions.FlushError perché session contiene due istanze della stessa Entity con identica chiave primaria.

prima domanda: perché l'oggetto session non mi segnala la cosa prima del flush, magari all'atto della creazione del secondo oggetto?

seconda domanda: navigando nel codice di elixir mi sono andato a spulciare l'implementazione della classe Entity, ma nel suo __init__ non ho trovato traccia di invocazioni a sessio.save. Vorrei capire come, a seguito della creazione di un oggetto di tipo Entity, questo viene aggiunto a session

grazie mille per l'aiuto!

marco.r
21-05-2008, 14:01
prima domanda: perché l'oggetto session non mi segnala la cosa prima del flush, magari all'atto della creazione del secondo oggetto?

Non conosco sqlalchemy, mi sembra di capire che finche non chiami la flush i dati non vengono mandati al database, per cui l'unico modo in cui potrebbe venire controllata una cosa del genere sarebbe tenendo traccia di tutte le istanze. Fattibile ma scomodo e lento. Oltretutto potrebbe in alcuni casi potrebbe tornare comodo poter creare un oggetto "doppio" (ad esempio deserializzandolo da file), verificarne eventuali collisioni e in tal caso eliminarlo.

mad_hhatter
21-05-2008, 14:09
dalla documentazione di Session:


Another important facet of the Session is that it's also maintaining unique copies of each instance, where "unique" means "only one object with a particular primary key" - this pattern is called the Identity Map.


però una session può contenere 2 relazioni con la stessa chiave privata... non capisco.

per questo vorrei capire dove, nel codice di elixir, gli oggetti creati vengono aggiunti alla session...

ti ringrazio comunque per la tua risposta