У меня есть небольшая проблема, похожая на 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(). Вот почему я думаю, что можно получить оригинальные значения. Они где-то прячутся.
Но где?
но как откат получить предыдущее состояние объекта? Итак, я выполнил 'session.flush()', мои изменения перешли в базу данных. И оба состояния, в которых хранятся предыдущие и текущие. Правильно ли я это понимаю? Но могу ли я получить предыдущее состояние без выполнения отката? Как 'user.get_history_after_flush()' – MrCyberthrone
Я не управляю серверами базы данных, но да, когда вы вызываете flush(), изменения поступают в базу данных. Можно что-то заметить; это изменяется только для этой сессии. Это означает, что эти изменения не будут получены с помощью другого сеанса. Если вы сделаете фиксацию, вы не сможете вернуть предыдущие значения. – metmirr