Mysql
 sql >> Database >  >> RDS >> Mysql

Informazioni sull'aggiornamento degli oggetti nella sessione di sqlalchemy

Le sessioni sono progettate per funzionare in questo modo . Gli attributi dell'oggetto nella sessione B manterranno quello che aveva quando interrogato per la prima volta nella sessione B. Inoltre, SQLAlchemy non tenterà di aggiornare automaticamente gli oggetti in altre sessioni quando cambiano, né penso che sarebbe saggio provare a creare qualcosa così.

Dovresti pensare attivamente alla durata di ogni sessione come a una singola transazione nel database. Come e quando le sessioni devono affrontare il fatto che i loro oggetti potrebbero essere obsoleti non è un problema tecnico che può essere risolto da un algoritmo integrato in SQLAlchemy (o qualsiasi estensione per SQLAlchemy):è un problema "business" la cui soluzione è necessario determinare e codificare te stesso. La risposta "corretta" potrebbe dire che questo non è un problema:la logica che si verifica con la sessione B potrebbe essere valida se utilizza i dati al momento dell'avvio della sessione B. Il tuo "problema" potrebbe non essere effettivamente un problema. I documenti in realtà hanno un intera sezione su quando utilizzare le sessioni , ma dà una risposta piuttosto cupa se speri in una soluzione adatta a tutti...

Detto questo, ci sono alcune cose che puoi fare per cambiare il modo in cui funziona la situazione:

Innanzitutto, puoi ridurre il tempo di apertura della sessione. La sessione B sta interrogando l'oggetto, quindi in seguito stai facendo qualcosa con quell'oggetto (nella stessa sessione) per cui vuoi che gli attributi siano aggiornati. Una soluzione è eseguire questa seconda operazione in una sessione separata.

Un altro consiste nell'utilizzare i metodi di scadenza/aggiornamento, come i documenti mostra ...

# immediately re-load attributes on obj1, obj2
session.refresh(obj1)
session.refresh(obj2)

# expire objects obj1, obj2, attributes will be reloaded
# on the next access:
session.expire(obj1)
session.expire(obj2)

Puoi usare session.refresh() per ottenere immediatamente una versione aggiornata dell'oggetto, anche se la sessione ha già eseguito query sull'oggetto in precedenza.