2011-12-06 15 views
45

C'è un modo per scrivere una query delete/deleteAll come findAll?Sequelize.js elimina la query?

Per esempio io voglio fare qualcosa di simile (assumendo MyModel è un modello Sequelize ...):

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

risposta

98

per chiunque utilizzi Sequelize versione 3 e successive, l'uso:

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

Sequelize Documentation - Sequelize Tutorial

+0

come non è questa la risposta accettata? +1 a voi signore. – Rojuinex

+0

È una domanda piuttosto vecchia quindi al momento credo che Sequelize non avesse un metodo di distruzione sorprendentemente – ncksllvn

+2

Abbastanza corretto; anche se questo è il primo risultato di ricerca su Google, e anche le persone sono scoraggiate dal fare domande che sono già state poste, sembra che la risposta accettata debba essere aggiornata ... ma probabilmente è più un problema del sito. – Rojuinex

18

Ho cercato in profondità nel codice, passo dopo passo nei seguenti file:

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

Quello che ho trovato:

Non c'è un metodo CancTutti, c'è un metodo destroy() è possibile chiamare su un record, ad esempio:

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

Sì, conoscevo il metodo destroy, ma purtroppo è solo per un record. Credo che dovrò scrivere il mio metodo deleteAll. Grazie! – lakenen

+0

Davvero strano che questo non esista. Forse puoi scrivere tu stesso e inviare una richiesta di pull per sequelize. Sono sicuro che altre persone potrebbero davvero usarlo. – alessioalex

+0

Sentitevi liberi di inviare una richiesta di pull o di aprire un problema nel repository github :) – sdepold

2

ho scritto qualcosa così per vele un po 'indietro, nel caso in cui esso consente di risparmiare un po' di tempo:

Esempio di utilizzo:

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

Fonte:

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

da: orm.js.

Spero che questo aiuti!

15

Non so se la domanda è ancora pertinente, ma ho trovato quanto segue sulla documentazione di 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

Speranza che aiuta!

+1

Per riferimento, questo è definito in [lib/model.js] (https://github.com/sequelize/sequelize/blob/51ce2fb7f60359fc04814afe6779bb0ada41b18d/lib/model.js#L1272) e non è necessario utilizzare un stringa. Puoi usare qualsiasi tipo di oggetto 'where' (ad es.' {SomeId: 123} '). – Domi

7

Questo esempio mostra come vi promette invece di callback.

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

controllare questo link per maggiori informazioni http://docs.sequelizejs.com/en/latest/api/model/#destroyoptions-promiseinteger

+0

non dovrebbe rowDeleted essere 1 quando si verifica l'eliminazione riuscita di una riga? – saraf

+0

Sì, giusto. Grazie per segnalarlo. –

2

Nella nuova versione, è possibile provare qualcosa di simile

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