Пейджер

Опыт на работе: Проблемы с методом upsert в Sequelize

Опыт на работе: Проблемы с методом upsert в Sequelize

Сегодня на работе, после сдачи очередной задачи, которая была довольно-таки хорошо выполнена, покрыта тестами и типизирована, прилетел reject. Задача касалась back-end разработки. По сути, ничего сложного: создать модель, реализовать для неё обычный CRUD, немного приправить бизнес-логикой и отдать этот «горячий пирожок» на тестирование.

С большим интересом я начал разбираться, в чём же дело. Хотел скорее передать задачу на front-end, якобы не ко мне вопросы, но нет — моя оплошность.

В качестве ORM мы используем Sequelize, а база данных — PostgreSQL. Поскольку модель была новая, назовём её job-application, которая связана с моделью job в отношении 1 к 1. Необходимо было, чтобы на каждое обновление job создавалась новая сущность job-application или обновлялась уже существующая.

Я решил, что метод upsert от Sequelize идеально справится с такой тривиальной задачей: метод либо создает новую запись insert, либо обновляет существующую update. Но как же я ошибался! Upsert выдавал ошибку о том, что "данная запись с таким jobId уже существует". Метод не обновлял существующую запись, а пытался создать новую.

Итого: почему так получилось? Upsert не учитывал, что jobId является уникальной колонкой, и в качестве триггера, сигнализирующего о существовании записи, служил primary key, или если он не передан в метод, то первый из списка уникальных колонок. Поэтому конфликтов не было, и метод пытался каждый раз создать новую запись.

Урок: При использовании upsert важно правильно настраивать уникальные ключи и понимать, какие поля рассматриваются для обновления или создания новой записи. В данном случае, необходимо было явно указать, что триггер должен проверяться по jobId, чтобы метод upsert корректно обновлял существующую запись вместо создания новой.

---

Надеюсь, этот опыт поможет избежать подобных ошибок в будущем! Если у кого-то был похожий кейс или есть дополнения по работе с Sequelize, буду рад обсудить в комментариях.

#ORM
Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.
Подписаться на @ivanchikovitclub Открыть пост в Telegram