2015-03-09 4 views
2

Я использую SQLAlchemy's provided contextmanager для обработки сеансов для меня. То, что я не понимаю, как получить автоматически сгенерированный идентификатор, потому что (1) идентификатор не создаются, пока после commit() называют еще (2) вновь созданный экземпляр доступен только в рамках контекста менеджера:Как использовать SQLAlchemy contextmanager и все еще получать идентификатор строки?

def save_soft_file(name, is_geo=False): 
    with session_scope() as session: 
     soft_file = models.SoftFile(name=name, is_geo=is_geo) 
     session.add(soft_file) 
     # id is not available here, because the session has not been committed 
    # soft_file is not available here, because the session is out of context 
    return soft_file.id 

Что мне не хватает?

ответ

2

Используйте session.flush() для выполнения ожидающих команд в текущей транзакции.

def save_soft_file(name, is_geo=False): 
    with session_scope() as session: 
     soft_file = models.SoftFile(name=name, is_geo=is_geo) 
     session.add(soft_file) 
     session.flush() 
     return soft_file.id 

Если происходит исключение после flush, но до начала сессии выходит из области видимости, изменения будут отката к началу транзакции. В этом случае ваш soft_file фактически не будет записан в базу данных, хотя ему был присвоен идентификатор.

Смежные вопросы