Привет! SQLAlchemy устроен так, что сессия при повторном запросе одной и той же строки из БД в рамках транзакции не обновляет соответственный ей объект, сформированный при первом запросе. Т.е. получив объект один раз, повторный его запрос в транзакции не изменит объект, хотя значения в БД уже могли быть изменены.
alex = session.query(User).filter_by(name='Alex').first()
# в этот момент соответствующая запись в БД изменяется другим процессом
alex = session.query(User).filter_by(name='Alex').first()
# объект alex не изменится и будет соответствовать первому запросу, т.е. по сути у объекта останутся устаревшие данные, не соответствующие текущему состоянию БД
session.commit()
Помогите, пожалуйста, разобраться, чем обосновано такое поведение?
Объяснение в доках довольно не понятное:
Сессия не может полностью предсказать, когда тот же запрос SELECT, выполненный во второй раз, обязательно вернет те же данные, которые у нас уже есть, или это будут новые данные.
Почему бы просто не обновить атрибуты объекта полученными данными из БД, новыми или старыми?