2011-12-06 19 views
45

¿Hay alguna manera de escribir una consulta delete/deleteAll like findAll?Sequelize.js ¿eliminar consulta?

Por ejemplo, yo quiero hacer algo como esto (suponiendo MyModel es un modelo Sequelize ...):

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

Respuesta

98

Para cualquier persona que utilice Sequelize versión 3 y superior, utilice:

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

Sequelize Documentation - Sequelize Tutorial

+0

¿cómo no es esta la respuesta aceptada? +1 a usted, señor. – Rojuinex

+0

Es una pregunta bastante antigua, por lo que en ese momento supongo que Sequelize no tenía un método de destrucción sorprendentemente – ncksllvn

+2

Lo suficiente; sin embargo, debido a que este es el primer resultado de búsqueda en Google, y las personas también se sienten desanimadas de hacer preguntas que ya han sido formuladas, parece que la respuesta aceptada debería actualizarse ... pero probablemente sea un problema mayor en todo el sitio. – Rojuinex

18

He buscado profundamente en el código, paso a paso en los siguientes archivos:

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

Lo que encontré:

no hay un método deleteAll, hay un método destroy() se puede llamar en un registro, por ejemplo:

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

Sí, sabía sobre el método de destruir, pero por desgracia es sólo para un registro Creo que tendré que escribir mi propio método deleteAll. ¡Gracias! – lakenen

+0

Realmente extraño que esto no exista. Tal vez puedas escribirlo tú mismo y enviar una solicitud de extracción para realizar una secuencia. Estoy seguro de que otras personas podrían realmente usarlo. – alessioalex

+0

No dude en enviar una solicitud de extracción o abrir un problema en el repositorio de github :) – sdepold

2

Yo he escrito así por las velas hace un tiempo, en caso de que le ahorra un tiempo:

Ejemplo de uso:

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

Fuente:

/** 
* 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.

Espero que ayude!

15

No sé si la pregunta todavía es relevante pero he encontrado lo siguiente en la documentación 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

espero que ayude!

+1

Como referencia, esto se define en [lib/model.js] (https://github.com/sequelize/sequelize/blob/51ce2fb7f60359fc04814afe6779bb0ada41b18d/lib/model.js#L1272), y no tiene que usar un cuerda. Puede usar cualquier tipo de objeto 'where' (por ejemplo' {someId: 123} '). – Domi

7

Este ejemplo muestra cómo se promete en lugar de devolución de llamada.

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

Comprobar este enlace a cabo para obtener más información http://docs.sequelizejs.com/en/latest/api/model/#destroyoptions-promiseinteger

+0

no debería rowDeleted ser 1 cuando compruebas si se borró con éxito una fila? – saraf

+0

Sí, tu derecha. Gracias por mencionarlo. –

2

En la nueva versión, se puede intentar algo como esto

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