Sequelize.js supprimer la requête?


99

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

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

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

Réponses:


240

Pour toute personne utilisant Sequelize version 3 et supérieure, utilisez:

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

Documentation Sequelize - Tutoriel Sequelize


C'est une question assez ancienne, donc à l'époque, je suppose que Sequelize n'avait pas de méthode de destruction étonnamment
ncksllvn

3
C'est suffisant; Cependant, comme il s'agit du premier résultat de recherche sur Google, et que les gens sont également découragés de poser des questions qui ont déjà été posées, il semble que la réponse acceptée devrait être mise à jour ... mais c'est probablement plus un problème à l'échelle du site.
Rojuinex

1
Je me demande que la documentation de suite ne donne pas, cet exemple de codage assez facile ... Tout le monde peut le comprendre. Merci ncksllvn. Vous économisez mon temps ...
weeraa

Comment gérez-vous si l'identifiant est un identifiant invalide?
Rod

21

J'ai cherché profondément dans le code, étape par étape 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#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

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

Oui, je connaissais la méthode de destruction, mais malheureusement, ce n'est que pour un seul disque. Je suppose que je vais devoir écrire ma propre méthode deleteAll. Merci!
lakenen

Vraiment bizarre que cela n'existe pas. Peut-être que vous pouvez l'écrire vous-même et soumettre une demande de tirage pour séquencer. Je suis sûr que d'autres personnes pourraient vraiment l'utiliser.
alessioalex

1
N'hésitez pas à soumettre une pull request ou à ouvrir un problème dans le référentiel github :)
sdepold

3
destroy () n'est pas dans la documentation sur sequelizejs.com, au cas où quelqu'un d'autre chercherait ça comme moi
mikermcneil

2
Vos liens me renvoient tous des 404. Suis-je le seul?
OrwellHindenberg

16

Je ne sais pas si la question est toujours pertinente mais j'ai trouvé ce qui suit sur 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-0

J'espère que ça aide!


2
Pour référence, ceci est défini dans lib / model.js , et vous n'avez pas besoin d'utiliser une chaîne. Vous pouvez utiliser n'importe quelle sorte d' whereobjet (par exemple {someId: 123}).
Domi

10

Cet exemple montre comment vous des promesses au lieu d'un rappel.

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/en/latest/api/model/#destroyoptions-promiseinteger


1
rowDeleted ne doit-il pas être égal à 1 lors de la vérification de la suppression réussie d'une ligne?
saraf

1
Cela ne fonctionne plus comme ça. Le retour est l'ID de ligne affecté / non le nombre de lignes affectées.
Tony Butler

Ne devriez-vous pas utiliser catch pour attraper l'erreur au lieu de callback?
Ahmed Ghrib le

8

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

Voici un exemple 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 l' !!opérateur Bang Bang sur le résultat de l'attente qui changera le résultat en booléen.


2

J'ai écrit quelque chose comme ça 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
});

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

de: orm.js .

J'espère que cela pourra aider!


0
  1. la meilleure façon de supprimer un enregistrement est de le trouver en premier (s'il existe dans la base de données au même moment où vous souhaitez le supprimer)
  2. regarde 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

Supprimer tout, pas de conditions:

Model.destroy({
    truncate: true,
})
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.