2017-02-23 33 views
0

У меня есть небольшая проблема, похожая на Getting fields history before flushКак получить исходное значение измененных полей в sqlalchemy после session.flush()?

Вот мой код:

user = User.query.filter(User.id == user_id).first() 

print(user.first_name) 
# Rick 

user.first_name = 'Anders' 

print(get_history(user, 'first_name')) 
# History(added=[u'Anders'], unchanged=(), deleted=[u'Rick']) 

db.session.flush() 

print(get_history(user, 'first_name')) 
# History(added=(), unchanged=[u'Anders'], deleted=()) 

Таким образом, я могу легко получить исходное значение до флеша. Я могу использовать get_history и «грязный» атрибут сеанса. Но когда я делаю session.flush(), этот метод показывает неправильный результат, а «грязный» пуст.

Однако я могу отменить эти изменения, используя session.rollback() после session.flush(). Вот почему я думаю, что можно получить оригинальные значения. Они где-то прячутся.

Но где?

ответ

0

session.flush() записывает все ожидающие объект создания, удаления и изменения в базу данных в качестве вставки, удаления, обновления и т.д.

Так что, когда вы звоните session.flush() ваши объекты, которые вы добавляете сеанс (session.add(object)) поступает в базу данных, но они arent записываются постоянно до фиксации (session.commit()) или откат.

Ответ на ваш вопрос: ваши объекты в базе данных с session.flush()

+0

но как откат получить предыдущее состояние объекта? Итак, я выполнил 'session.flush()', мои изменения перешли в базу данных. И оба состояния, в которых хранятся предыдущие и текущие. Правильно ли я это понимаю? Но могу ли я получить предыдущее состояние без выполнения отката? Как 'user.get_history_after_flush()' – MrCyberthrone

+0

Я не управляю серверами базы данных, но да, когда вы вызываете flush(), изменения поступают в базу данных. Можно что-то заметить; это изменяется только для этой сессии. Это означает, что эти изменения не будут получены с помощью другого сеанса. Если вы сделаете фиксацию, вы не сможете вернуть предыдущие значения. – metmirr