web-dev-qa-db-fra.com

Sequelize.js delete query?

Y a-t-il un moyen d'écrire une requête delete/deleteAll comme findAll?

Par exemple, je veux faire quelque chose comme ceci (en supposant que MyModel est un modèle Sequelize ...):

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

Pour ceux qui utilisent Sequelize version 3 ou supérieure, utilisez:

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

Documentation Sequelize - Tutoriel Sequelize

180
ncksllvn

J'ai cherché dans le code, pas à pas, dans les fichiers suivants:

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

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

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

Ce que j'ai trouvé:

Il n'y a pas de méthode deleteAll, il y a une méthode destroy () que vous pouvez appeler sur un enregistrement, par exemple:

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

Je ne sais pas si la question est toujours d'actualité, mais j'ai trouvé ce qui suit dans la documentation de 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-

J'espère que ça aide!

15
cgiacomi

Cet exemple montre comment vous promettre au lieu de rappeler.

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); 
});

Consultez ce lien pour plus d'informations http://docs.sequelizejs.com/fr/latest/api/model/#destroyoptions-promiseinteger

8
Hisham Haniffa

Dans la nouvelle version, vous pouvez essayer quelque chose comme ça

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);
        });
4
Adiii

Voici un exemple d'ES6 utilisant Await/Async:

    async deleteProduct(id) {

        if (!id) {
            return {msg: 'No Id specified..', payload: 1};
        }

        try {
            return !!await products.destroy({
                where: {
                    id: id
                }
            });
        } catch (e) {
            return false;
        }

    }

Veuillez noter que j'utilise le !! _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _] Bang Bang Opérateur sur le résultat de l'attente qui changera le résultat en booléen.

2
li x

J'ai écrit quelque chose comme ceci pour Sails il y a quelque temps, au cas où cela vous ferait gagner du temps:

Exemple d'utilisation:

// 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
});

Source:

/**
 * 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();
}

à partir de: orm.js .

J'espère que ça t'as aidé!

2
mikermcneil

dernière @ 2019 async et attend

const id = 12;

const result = await User.destroy({ where: { id });

use result 
0
Frank HN
  1. la meilleure façon de supprimer un enregistrement est de le trouver en premier (s'il existe dans la base de données en même temps que vous voulez le supprimer)
  2. regarder ce code
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));
0
bahri noredine