Sequelize - Как добавить/вставить строку с тем же первичным ключом обратимо удаленной строки

Я использую Sequelize ORM. У меня есть модель для таблицы, в которой у нас включено мягкое удаление через paranoid: true.

Вопрос. Есть ли способ сделать upsert таким образом, чтобы, если объект уже существует в таблице, но был обратимо удален, он просто очистил столбец deleteAt?

Пример настройки: model.js

const Sequelize = require('sequelize')
const sequelize = new Sequelize(
  dbName,
  username,
  password,
  {
    host,
    dialect: 'mysql',
    port
  }
)

const model =  sequelize.define(
  'sample_table',
  {
    uid: {
      type: Sequelize.STRING(60),
      allowNull: false
      primaryKey: true
    },
    deletedAt: {
      type: Sequelize.Date,
      allowNull: true,
      default: null
    }
  },
  {
    tableName: 'sample_table'
    deletedAt: true,
    paranoid: true
  }
)

Пример использования:

const model = require('./model.js')

(async () => {
  const myModel = await model.create({
    uid: 'sample-uid'
  })

  await myModel.destroy()

  // error is encountered because uid already exists
  await model.create({
    uid: 'sample-uid'
  })
})()


person armorkram    schedule 08.05.2019    source источник


Ответы (1)


Да, но вы должны сделать это вручную (например, добавить метод catch для создания и использовать .restore() для очистки столбца deleteAt).

Либо можно добавить первичный ключ на uid+deletedAt и ваш код должен работать без ошибок.

const model = require('./model.js')

(async () => {
  const myModel = await model.create({
    uid: 'sample-uid'
  })

  await myModel.destroy()

  // if primary key uid and deletedAt then no error here
  await model.create({
    uid: 'sample-uid'
  })
})()
person Dmytro Mysak    schedule 08.05.2019
comment
Спасибо! В итоге я сделал ваше первое предложение. На самом деле это метод, сгенерированный ассоциацией, я расширил функциональность сгенерированных методов в прототипе. Второе предложение также сработает в моем случае, поскольку оно не будет для сильно заполненной таблицы. - person armorkram; 09.05.2019