Sequelize.js ¿eliminar consulta?


99

¿Hay alguna forma de escribir una consulta delete / deleteAll como findAll?

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

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

Respuestas:


236

Para cualquiera que use Sequelize versión 3 y superior, use:

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

Sequelize Documentation - Tutorial de Sequelize


Es una pregunta bastante viejo, así que en el momento supongo Sequelize no tenía un método destroy sorprendentemente
ncksllvn

3
Lo suficientemente justo; sin embargo, debido a que este es el primer resultado de búsqueda en Google, y las personas también se desalientan de hacer preguntas que ya se han formulado, parece que la respuesta aceptada debería actualizarse ... pero probablemente sea más un problema de todo el sitio.
Rojuinex

1
Me pregunto que la documentación de la secuenciación no da, esta muestra de codificación bastante fácil ... Cualquiera puede entender esto. Gracias ncksllvn. Me ahorras tiempo ...
weeraa

¿Cómo se maneja si la identificación no es válida?
Rod

21

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 () al que 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
    }
  })
})

Sí, sabía sobre el método de destrucción, pero desafortunadamente es solo para un registro. Supongo que tendré que escribir mi propio método deleteAll. ¡Gracias!
Lakenen

Realmente extraño que esto no exista. Tal vez pueda escribirlo usted mismo y enviar una solicitud de extracción para secuenciar. Estoy seguro de que otras personas realmente podrían usarlo.
alessioalex

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

3
destruir () no está en la documentación de sequelizejs.com, en caso de que alguien más estuviera aquí buscando eso como yo
mikermcneil

2
Todos tus enlaces me devuelven 404. ¿Soy el único?
OrwellHindenberg

16

No sé si la pregunta sigue siendo relevante, pero encontré 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 eso ayude!


2
Como referencia, esto se define en lib / model.js , y no tiene que usar una cadena. Puede utilizar cualquier tipo de whereobjeto (por ejemplo {someId: 123}).
Domi

10

Este ejemplo muestra cómo hacer promesas 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); 
});

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


1
¿No debería rowDeleted ser 1 al verificar la eliminación exitosa de una fila?
Saraf

1
Esto ya no funciona así. El retorno es el ID de fila afectado / no el recuento de filas afectadas.
Tony Butler

¿No debería usar catch para detectar el error en lugar de la devolución de llamada?
Ahmed Ghrib

8

En la nueva versión, puedes probar 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);
        });

4

Aquí hay un ejemplo de ES6 usando 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;
        }

    }

Tenga en cuenta que estoy usando el !!operador Bang Bang en el resultado de la espera que cambiará el resultado a un booleano.


2

Escribí algo como esto para Sails hace un tiempo, en caso de que te ahorre algo de tiempo:

Uso de ejemplo:

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

a partir de: orm.js .

¡Espero que ayude!


0
  1. la mejor manera de eliminar un registro es encontrarlo en primer lugar (si existe en la base de datos al mismo tiempo que desea eliminarlo)
  2. mira este código
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

Eliminar todo, sin condiciones:

Model.destroy({
    truncate: true,
})
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.