2010-10-07 11 views
23

Este: Intro to object states enumera las cuatro permutaciones de presencia-en-DB/presencia, durante la reunión:sqlalchemy: obtener el objeto estado de la instancia

transient, pending, persistent & detached 

¿Hay alguna manera de hacer consultas a un objeto determinado para volver a cuál de las cuatro estados en los que se encuentra el objeto?

Intenté rooting en _sa_instance_state pero no encontré nada relevante.

Gracias!

Respuesta

10

Mejor uso Inspection API:

from sqlalchemy import inspect 
state = inspect(obj) 

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

Tenga en cuenta que 'state.deleted' solo se actualiza después de que' Session.flush() 'en realidad elimina el registro de la base de datos. Antes de 'flush()', parece que la única forma de comprobar si se ha llamado a 'Session.delete()' en el objeto es [buscarlo en Session.deleted] (http://stackoverflow.com/a/20963631/648162) como sugiere @ Erik49. – qris

+0

hace esto 'def state (object): return inspeccionar (object)' hacer lo mismo? – roy

30

[Actualización: Esta respuesta es para las versiones antes de 0.8]

encontrado que es 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

Esto definitivamente no es la manera más obvia! Creo que el código es más legible si usas 'inspeccionar (obj)' como [mostrado arriba por @kolypto] (http://stackoverflow.com/a/25427235/648162). – qris

+0

Gracias @qris: ha cambiado la respuesta aceptada. La pregunta fue hecha antes de que se introdujera el sistema inspeccionar. – EoghanM

2

otra opción, que enumera todos los objetos en estados particulares dentro de una sesión: 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

Tenga en cuenta que 'session.deleted' contiene el objeto solo entre' delete() 'y' flush() ', mientras' inspection (object) .deleted' devuelve True solo después de 'flush()', por lo que no son equivalentes. – qris

3

Otra opción es object_state, resintonizando 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

Parece que estas propiedades se agregaron en SQLA 0.8 – EoghanM

Cuestiones relacionadas