Опыт на работе: Проблемы с методом upsert в Sequelize
Опыт на работе: Проблемы с методом
Сегодня на работе, после сдачи очередной задачи, которая была довольно-таки хорошо выполнена, покрыта тестами и типизирована, прилетел reject. Задача касалась back-end разработки. По сути, ничего сложного: создать модель, реализовать для неё обычный CRUD, немного приправить бизнес-логикой и отдать этот «горячий пирожок» на тестирование.
С большим интересом я начал разбираться, в чём же дело. Хотел скорее передать задачу на front-end, якобы не ко мне вопросы, но нет — моя оплошность.
В качестве ORM мы используем Sequelize, а база данных —
Я решил, что метод upsert от Sequelize идеально справится с такой тривиальной задачей: метод либо создает новую запись
Итого: почему так получилось?
Урок: При использовании
---
Надеюсь, этот опыт поможет избежать подобных ошибок в будущем! Если у кого-то был похожий кейс или есть дополнения по работе с
#ORM
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.