Отложите проверку УНИКАЛЬНОГО ограничения в продолжении - PullRequest
0 голосов
/ 30 апреля 2020

Я использую sequelize с базой данных postgres. Одна из моих моделей баз данных выглядит следующим образом:

const { Deferrable } = require("sequelize");

module.exports = (Sequelize, DataTypes) => {
  return Sequelize.define("User", {
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
    },
    name: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      deferrable: Deferrable.INITIALLY_DEFERRED,
    },
  });
};

Теперь у меня есть массив обновленных пользовательских объектов, и я хочу соответственно обновить свою базу данных. Я использую следующий код:

const updatedUsers = [];

try {
  const users = await User.findAll();
  await sequelize.transaction(async (t) => {
    for (const user of users) {
      const updatedUser = updatedUsers.find((user) => user.id === user.id);
      await user.update({ name: updatedUser.name }, { transaction: t });
    }
  });
} catch (error) {}

Однако могут быть ситуации, подобные следующим:

// users stored in the database:
{
  id: 1,
  name: "a"
},
{
  id: 2,
  name: "b"
}

// updatedUsers array:
{
  id: 1,
  name: "b"
},
{
  id: 2,
  name: "a"
}

В таком случае мой код завершается с ошибкой SequelizeUniqueConstraintError, поскольку имя первого пользователя не может быть обновлен до «b» до того, как имя второго пользователя было обновлено. Можно ли отложить проверку уникального ограничения до конца моей транзакции, когда все пользователи были обновлены?

...