2010-10-07 12 views
23

to: Intro to object states wymienia cztery permutacje obecność-in-DB/obecność w sesji:sqlalchemy: uzyskać obiekt stanu instancji

transient, pending, persistent & detached 

Czy istnieje jakiś sposób odpytywanie danego obiektu, aby powrócić które z cztery stany, w których znajduje się obiekt?

Próbowałem zakorzeniać się w _sa_instance_state, ale nie mogłem znaleźć nic istotnego.

Dzięki!

Odpowiedz

10

Lepsze wykorzystanie Inspection API:

from sqlalchemy import inspect 
state = inspect(obj) 

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

Zwróć uwagę, że 'state.deleted' jest aktualizowane tylko po tym, jak' Session.flush() 'faktycznie usunie rekord z bazy danych. Przed 'flush()' wydaje się, że jedynym sposobem sprawdzenia, czy 'Session.delete()' został wywołany na obiekcie, jest [poszukaj go w Session.deleted] (http://stackoverflow.com/a)/20963631/648162) zgodnie z sugestią @ Erik49. – qris

+0

czy ten "def stan (obiekt): return inspect (object)" zrobić to samo? – roy

30

[Aktualizacja: Ta odpowiedź jest dla wersji przed 0.8]

Znaleziona 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

To zdecydowanie nie jest najbardziej oczywistym sposobem! Myślę, że kod jest bardziej czytelny, jeśli użyjesz 'inspect (obj)' jako [pokazanego powyżej przez @kolypto] (http://stackoverflow.com/a/25427235/648162). – qris

+0

Dzięki @qris - zmieniono zaakceptowaną odpowiedź. Pytanie zostało zadane przed wprowadzeniem systemu kontroli. – EoghanM

2

inna opcja, która zawiera listę wszystkich obiektów w poszczególnych krajach w ramach sesji: 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

Należy zauważyć, że 'session.deleted' zawiera obiekt tylko pomiędzy' delete() 'i' flush() ', podczas gdy' inspect (object) .deleted' zwraca True tylko po 'flush()', więc nie są one równoważne. – qris

3

Inną opcją jest object_state, retuszowanie 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

Wygląda na to, że te właściwości zostały dodane w SQLA 0.8 – EoghanM

Powiązane problemy