Спасибо. get_model() - это функция получения объекта модели, в монолите на фласке... Мне нужно привязаться к изменению полей сущностей карточки Контрагента( био дата, адрес, контакты и тд) К сожалению, монолит, с которым я работаю не отправляет гарантированный сигнал после коммита сущности.
Alexander, Вы увеличили карму Pavel Павлик до 1066.93 (+7.07)
Тогда не нужно использовать ивенты алхимии
я пытаюсь решить проблему: когда сохраняется или обновляется контакт/контрагент у этой сущности, в ядре монолита делаются флаши, и потом коммит. Но он не гарантирован, выходит, что подписываться к их сигналу нельзя. Грубо говоря: 1) Вася меняет свою фамилию в своей карточке 2) Диспетчер слушает сигнал (document_saved) 3) Передаёт id Сущности в микросервис через редис 4) микросервис хреначит в БД и собирает нужные поля для дальнейшего формирования JSON и отправки в другие интеграции. Проблема: на микросервис приходит ID сущности раньше, чем успел примениться коммит. Асинхронные задержки после получения ID выставлять некорректно и ненадёжно, чтоб таким образом оттянуть запрос к БД и сборку новых полей.
https://microservices.io/patterns/data/transactional-outbox.html
я, кстати, ещё вот так думал решить проблему @event.listens_for(Contractor, 'after_commit') def receive_after_commit(session): print('after commit') но у нас легаси и используется: Flask-SQLAlchemy==2.4.4 SQLAlchemy==1.3.18 а там нету 'after_commit'
sqlalchemy.exc.InvalidRequestError: No such event 'after_commit' for target '<class 'models.Contractor'>'
Ну, так ивенты алхимии тут ни при чем. Просто отправляй все ивенты после коммита и все
Обсуждают сегодня