2010-10-07 11 views
23

questo: Intro to object states elenca i quattro permutazioni di presenza-in-DB/presenza-in-session:SQLAlchemy: ottenere l'oggetto stato dell'istanza

transient, pending, persistent & detached 

c'è un modo di interrogare un determinato oggetto da restituire, che della quattro stati in cui si trova l'oggetto?

Ho provato a fare il rooting in _sa_instance_state ma non ho trovato nulla di rilevante.

Grazie!

risposta

10

Migliore utilizzo Inspection API:

from sqlalchemy import inspect 
state = inspect(obj) 

# Booleans 
state.transient 
state.pending 
state.detached 
state.persistent 
+0

Nota che 'state.deleted' viene aggiornato solo dopo che' Session.flush() 'rimuove effettivamente il record dal database. Prima di 'flush()', sembra che l'unico modo per controllare se 'Session.delete()' è stato chiamato sull'oggetto è quello di [cercarlo in Session.deleted] (http://stackoverflow.com/a/20963631/648162) come suggerito da @ Erik49. – qris

+0

fa questo 'stato def (oggetto): return inspect (oggetto)' fa lo stesso? – roy

30

[Aggiornamento: Questa risposta è per le versioni precedenti 0,8]

trovato here:

from sqlalchemy.orm import object_session 
from sqlalchemy.orm.util import has_identity 

# transient: 
object_session(obj) is None and not has_identity(obj) 
# pending: 
object_session(obj) is not None and not has_identity(obj) 
# detached: 
object_session(obj) is None and has_identity(obj) 
# persistent: 
object_session(obj) is not None and has_identity(obj) 
+0

Questo non è sicuramente il modo più ovvio! Penso che il codice sia più leggibile se usi 'inspect (obj)' come [mostrato sopra da @kolypto] (http://stackoverflow.com/a/25427235/648162). – qris

+0

Grazie a @qris - hanno cambiato risposta accettata. La domanda è stata posta prima di introdurre il sistema di ispezione. – EoghanM

2

un'altra opzione, che elenca tutti gli oggetti in particolari stati all'interno di una sessione: http://docs.sqlalchemy.org/en/latest/orm/session.html#session-attributes

# pending objects recently added to the Session 
session.new 

# persistent objects which currently have changes detected 
# (this collection is now created on the fly each time the property is called) 
session.dirty 

# persistent objects that have been marked as deleted via session.delete(obj) 
session.deleted 

# dictionary of all persistent objects, keyed on their 
# identity key 
session.identity_map 
+0

Nota che 'session.deleted' contiene l'oggetto solo tra' delete() 'e' flush() ', mentre' inspect (object) .deleted' restituisce True solo dopo 'flush()', quindi questi non sono equivalenti. – qris

3

Un'altra opzione è object_state, in occasione di un nuovo InstanceState:

from sqlalchemy.orm.util import object_state 

state = object_state(obj) 
# here are the four states: 
state.transient # !session & !identity_key 
state.pending # session & !identity_key 
state.persistent # session & identity_key 
state.detached # !session & identity_key 
# and low-level attrs 
state.identity_key 
state.has_identity # bool(identity_key) 
state.session 
+0

Sembra che queste proprietà siano state aggiunte in SQLA 0.8 – EoghanM

Problemi correlati