@gpm7315

Почему SQLAlchemy не обновляет объект после повторного его запроса?

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

Помогите, пожалуйста, разобраться, чем обосновано такое поведение?
Объяснение в доках довольно не понятное:
Сессия не может полностью предсказать, когда тот же запрос SELECT, выполненный во второй раз, обязательно вернет те же данные, которые у нас уже есть, или это будут новые данные.

Почему бы просто не обновить атрибуты объекта полученными данными из БД, новыми или старыми?
  • Вопрос задан
  • 467 просмотров
Пригласить эксперта
Ответы на вопрос 1
@diman40
Python junior
Как я понимаю, нужно смотреть в сторону режима изоляции транзакций для выбранной БД.
В случае MySQL+SQLAlchemy можно попробовать так:
create_engine(DB_URL, isolation_level='READ COMMITTED')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы