【问题标题】:Sequelize - How to add/upsert row with same primary key of soft deleted rowSequelize - 如何添加/更新与软删除行的主键相同的行
【发布时间】:2019-05-08 19:10:31
【问题描述】:

我正在使用续集 ORM。我有一个表模型,我们通过paranoid: true 启用了软删除。

问题:有没有办法进行 upsert,如果对象已经存在于表中但被软删除,它只会清除 deletedAt 列?

示例设置: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'
  })
})()

【问题讨论】:

    标签: sequelize.js upsert soft-delete


    【解决方案1】:

    是的,但您应该手动执行(例如,添加 catch 以创建方法并使用 .restore() 清除 deletedAt 列)。

    或者您可以在 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'
      })
    })()
    

    【讨论】:

    • 谢谢!我最终做了你的第一个建议。它实际上是一个关联生成方法,我在原型中扩展了生成方法的功能。第二个建议也适用于我的情况,因为它不适用于人口众多的表格。
    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    相关资源
    最近更新 更多