SqlAlchemy: получить состояние экземпляра объекта - PullRequest
27 голосов
/ 08 октября 2010

This: Введение в состояния объекта перечисляет четыре перестановки присутствия в БД / присутствия в сеансе:

transient, pending, persistent & detached

Есть ли способ запросить данный объект, чтобы вернуть, в каком из четырех состояний находится объект?

Я пытался копаться в _sa_instance_state, но не смог найти ничего подходящего.

Спасибо!

Ответы [ 4 ]

31 голосов
/ 10 октября 2010

[Обновление: этот ответ для версий до 0.8]

Нашел здесь :

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) 
12 голосов
/ 21 августа 2014

Лучше использовать API проверки :

from sqlalchemy import inspect
state = inspect(obj)

# Booleans
state.transient
state.pending
state.detached
state.persistent
5 голосов
/ 25 марта 2014

Другой вариант: object_state , перенастройка 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
2 голосов
/ 07 января 2014

другая опция, которая перечисляет ВСЕ объекты в определенных состояниях в течение сеанса: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...