【问题标题】:Sequelize.js delete query?Sequelize.js 删除查询?
【发布时间】:2012-01-14 05:07:33
【问题描述】:

有没有办法像 findAll 一样编写 delete/deleteAll 查询?

例如我想做这样的事情(假设 MyModel 是 Sequelize 模型...):

MyModel.deleteAll({ where: ['some_field != ?', something] })
    .on('success', function() { /* ... */ });

【问题讨论】:

    标签: javascript node.js sequelize.js


    【解决方案1】:

    您可以使用如下所示删除所有行。

    general_category.destroy({ truncate: true, where: {} })
            
    

    【讨论】:

      【解决方案2】:

      使用 API 方法的示例

      exports.deleteSponsor = async (req, res) => {
        try {
      

      using conditions like userid,eventid and sponsorid

          const { userId } = req.body;
          const { eventId } = req.body;
          const { sponsorId } = req.body;
      

      checking exist or not

          if (!sponsorId)
            return res
              .status(422)
              .send({ message: "Missing Sponsor id in parameters" });
      `checking in db too`
      
          const sponsorDetails = await Sponsor.findAll({
            where: { [Op.or]: [{ id: sponsorId }] },
          });
      
          if (sponsorDetails.length === 0) {
            return res.status(422).send({ message: "Sponsor id not exist" });
          } else {
            await Sponsor.destroy({
      

      where clause as per your requirements you can change

              where: {
                id: sponsorId,
                userId: userId,
                eventId: eventId,
              }
            });
            return res
              .status(201)
              .send({ message: "Sponsor deleted successfully" });
          }
        } catch (err) {
          console.log(err);
          customGenericException(err, res);
        }
      };
      

      【讨论】:

        【解决方案3】:

        Sequelize 方法返回 Promise,并且没有 delete() 方法。 Sequelize 使用 destroy() 代替。

        示例

        Model.destroy({
          where: {
            some_field: {
              //any selection operation
              // for example [Op.lte]:new Date()
            }
          }
        }).then(result => {
          //some operation
        }).catch(error => {
          console.log(error)
        })
        

        文档了解更多详情:https://www.codota.com/code/javascript/functions/sequelize/Model/destroy

        【讨论】:

          【解决方案4】:

          我在下面的代码中使用了 sequelize.js、node.js 和 transaction,并添加了适当的错误处理,如果它找不到数据,它会抛出错误,即找不到具有该 id 的数据

          deleteMyModel: async (req, res) => {
          
              sequelize.sequelize.transaction(async (t1) => {
          
                  if (!req.body.id) {
                      return res.status(500).send(error.MANDATORY_FIELDS);
                  }
          
                  let feature = await sequelize.MyModel.findOne({
                      where: {
                          id: req.body.id
                      }
                  })
          
                  if (feature) {
                      let feature = await sequelize.MyModel.destroy({
                          where: {
                              id: req.body.id
                          }
                      });
          
                      let result = error.OK;
                      result.data = MyModel;
                      return res.status(200).send(result);
          
                  } else {
                      return res.status(404).send(error.DATA_NOT_FOUND);
                  }
              }).catch(function (err) {
                  return res.status(500).send(error.SERVER_ERROR);
              });
          }
          

          【讨论】:

            【解决方案5】:

            全部删除,无条件:

            Model.destroy({
                truncate: true,
            })
            

            【讨论】:

              【解决方案6】:
              1. 删除一条记录最好的方法是先找到它(如果数据库中同时存在你想删除它)
              2. 观看此代码
              const StudentSequelize = require("../models/studientSequelize");
              const StudentWork = StudentSequelize.Student;
              
              const id = req.params.id;
                  StudentWork.findByPk(id) // here i fetch result by ID sequelize V. 5
                  .then( resultToDelete=>{
                      resultToDelete.destroy(id); // when i find the result i deleted it by destroy function
                  })
                  .then( resultAfterDestroy=>{
                      console.log("Deleted :",resultAfterDestroy);
                  })
                  .catch(err=> console.log(err));
              

              【讨论】:

                【解决方案7】:

                这是一个使用 Await / Async 的 ES6 示例:

                    async deleteProduct(id) {
                
                        if (!id) {
                            return {msg: 'No Id specified..', payload: 1};
                        }
                
                        try {
                            return !!await products.destroy({
                                where: {
                                    id: id
                                }
                            });
                        } catch (e) {
                            return false;
                        }
                
                    }
                

                请注意,我在 await 的结果上使用了 !! Bang Bang 运算符,这会将结果更改为布尔值。

                【讨论】:

                  【解决方案8】:

                  在新版本中,你可以尝试这样的事情

                  function (req,res) {    
                          model.destroy({
                              where: {
                                  id: req.params.id
                              }
                          })
                          .then(function (deletedRecord) {
                              if(deletedRecord === 1){
                                  res.status(200).json({message:"Deleted successfully"});          
                              }
                              else
                              {
                                  res.status(404).json({message:"record not found"})
                              }
                          })
                          .catch(function (error){
                              res.status(500).json(error);
                          });
                  

                  【讨论】:

                    【解决方案9】:

                    对于使用 Sequelize 版本 3 及更高版本的任何人,请使用:

                    Model.destroy({
                        where: {
                            // criteria
                        }
                    })
                    

                    Sequelize Documentation - Sequelize Tutorial

                    【讨论】:

                    • 这是一个相当老的问题,所以当时我猜 Sequelize 出人意料地没有销毁方法
                    • 还不错;虽然因为这是 Google 上的第一个搜索结果,而且人们也不鼓励提出已经被问过的问题,所以似乎接受的答案应该得到更新......但这可能更像是一个网站范围的问题。
                    • 我想知道 sequelize 文档没有给出,这个非常简单的编码示例......任何人都可以理解这一点。谢谢你ncksllvn。你节省了我的时间......
                    • 如果id是无效id怎么处理?
                    【解决方案10】:

                    这个例子展示了如何用承诺而不是回调。

                    Model.destroy({
                       where: {
                          id: 123 //this will be your id that you want to delete
                       }
                    }).then(function(rowDeleted){ // rowDeleted will return number of rows deleted
                      if(rowDeleted === 1){
                         console.log('Deleted successfully');
                       }
                    }, function(err){
                        console.log(err); 
                    });
                    

                    查看此链接了解更多信息 http://docs.sequelizejs.com/en/latest/api/model/#destroyoptions-promiseinteger

                    【讨论】:

                    • 在检查是否成功删除一行时,rowDeleted 不应该为 1 吗?
                    • 这不再像那样工作了。返回的是受影响的行 ID / 不是受影响的行数。
                    • 你不应该使用catch来捕获错误而不是回调吗?
                    【解决方案11】:

                    不知道这个问题是否仍然相关,但我在 Sequelize 的文档中找到了以下内容。

                    User.destroy('`name` LIKE "J%"').success(function() {
                        // We just deleted all rows that have a name starting with "J"
                    })
                    

                    http://sequelizejs.com/blog/state-of-v1-7-0

                    希望对你有帮助!

                    【讨论】:

                    • 供参考,这是在lib/model.js 中定义的,您不必使用字符串。您可以使用任何类型的where 对象(例如{someId: 123})。
                    【解决方案12】:

                    不久前我为 Sails 写了这样的东西,以防它节省你一些时间:

                    使用示例:

                    // Delete the user with id=4
                    User.findAndDelete(4,function(error,result){
                      // all done
                    });
                    
                    // Delete all users with type === 'suspended'
                    User.findAndDelete({
                      type: 'suspended'
                    },function(error,result){
                      // all done
                    });
                    

                    来源:

                    /**
                     * Retrieve models which match `where`, then delete them
                     */
                    function findAndDelete (where,callback) {
                    
                        // Handle *where* argument which is specified as an integer
                        if (_.isFinite(+where)) {
                            where = {
                                id: where
                            };
                        }
                    
                        Model.findAll({
                            where:where
                        }).success(function(collection) {
                            if (collection) {
                                if (_.isArray(collection)) {
                                    Model.deleteAll(collection, callback);
                                }
                                else {
                                    collection.destroy().
                                    success(_.unprefix(callback)).
                                    error(callback);
                                }
                            }
                            else {
                                callback(null,collection);
                            }
                        }).error(callback);
                    }
                    
                    /**
                     * Delete all `models` using the query chainer
                     */
                    deleteAll: function (models) {
                        var chainer = new Sequelize.Utils.QueryChainer();
                        _.each(models,function(m,index) {
                            chainer.add(m.destroy());
                        });
                        return chainer.run();
                    }
                    

                    来自:orm.js

                    希望有帮助!

                    【讨论】:

                      【解决方案13】:

                      我已经对代码进行了深入的搜索,逐步进入以下文件:

                      https://github.com/sdepold/sequelize/blob/master/test/Model/destroy.js

                      https://github.com/sdepold/sequelize/blob/master/lib/model.js#L140

                      https://github.com/sdepold/sequelize/blob/master/lib/query-interface.js#L207-217

                      https://github.com/sdepold/sequelize/blob/master/lib/connectors/mysql/query-generator.js

                      我发现了什么:

                      没有 deleteAll 方法,有一个可以对记录调用的 destroy() 方法,例如:

                      Project.find(123).on('success', function(project) {
                        project.destroy().on('success', function(u) {
                          if (u && u.deletedAt) {
                            // successfully deleted the project
                          }
                        })
                      })
                      

                      【讨论】:

                      • 是的,我知道destroy方法,但不幸的是它只是为了一个记录。我想我必须编写自己的 deleteAll 方法。谢谢!
                      • 这不存在真的很奇怪。也许您可以自己编写并提交拉取请求以进行续集。我相信其他人真的可以使用它。
                      • 随时提交拉取请求或在 github 存储库中打开问题 :)
                      • destroy() 不在 sequelizejs.com 上的文档中,以防其他人像我一样在这里寻找它
                      • 您的链接都为我返回 404。只有我一个人吗?
                      猜你喜欢
                      • 1970-01-01
                      • 2014-08-28
                      • 2017-08-28
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-03-16
                      • 2014-02-16
                      相关资源
                      最近更新 更多