【问题标题】:How to clone/copy instance item/row in sequelize如何在续集中克隆/复制实例项/行
【发布时间】:2019-01-14 11:13:37
【问题描述】:

我试图找到一种在 Sequelize 中复制/克隆实例的方法,但没有成功。有没有办法使用内置功能或没有内置功能?我想要的是简单地复制数据库中的行,新项目应该只有一个不同的 id。

【问题讨论】:

  • 你能不能只删除find 行中的id(我假设是PK 和A_I)和create 数据?

标签: node.js sequelize.js sequelize-cli


【解决方案1】:

在 Model.js 中编写一个 Model.create(data) 函数,并从循环内部调用此函数,只要您需要,它将创建相同数据的副本。

【讨论】:

    【解决方案2】:

    没有这样的直接功能,你可以做的是:

    1. 获取要克隆/复制的对象
    2. 从中删除主键
    3. 从中创建一个新条目

      model.findOne({ //<---------- 1
                      where : { id : 1 } , 
                      raw : true })
      .then(data => {
          delete data.id; //<---------- 2
          model.create(data); //<---------- 3
      })
      

    【讨论】:

      【解决方案3】:

      您可能需要更新名称或其他字段以将其标识为副本,

      const data = await model.findOne({ where: {id: 1}, raw:  true, attributes: { exclude: ['id'] } });
      
      data.name = data.name + '(copy)';
      const newRecord = await model.create(data);
      

      【讨论】:

        【解决方案4】:

        如前所述,没有这样的直接功能(感谢 Vivek)

        如果您觉得有用,请将以下代码放在您的模型类中:

        async clone() {
            let cData = await THISISMYMODEL.findOne({
                where: { id: this.id},
                raw: true,
            });
        
            delete cData.id;
            return await THISISMYMODEL.create(data);
        }
        

        考虑到 "THISISMYMODEL" 应该是定义的模型类,而 "id" 应该是使用的主键属性。

        还要考虑到外键的使用(与其他模型的关系),它会使用相同的键。否则你也应该克隆这些实例。

        【讨论】:

          猜你喜欢
          • 2012-06-19
          • 1970-01-01
          • 2017-08-22
          • 2012-08-24
          • 2023-01-09
          • 1970-01-01
          • 2021-09-13
          • 2012-10-19
          • 2021-07-23
          相关资源
          最近更新 更多