Запрос на удаление Sequelize.js?


99

Есть ли способ написать запрос delete / deleteAll, например findAll?

Например, я хочу сделать что-то вроде этого (при условии, что MyModel - это модель Sequelize ...):

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

Ответы:


240

Для тех, кто использует Sequelize версии 3 и выше, используйте:

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

Документация по Sequelize - Учебное пособие по Sequelize


Это довольно старый вопрос, поэтому я думаю, что в то время у Sequelize на удивление не было метода уничтожения
— ncksllvn

3
Справедливо; хотя, поскольку это первый результат поиска в Google, и людям также не рекомендуется задавать вопросы, которые уже были заданы, похоже, что принятый ответ должен быть обновлен ... но это, вероятно, больше проблема всего сайта.
— Rojuinex

1
Мне интересно, что документация по сиквелизу не дает, это довольно простой пример кода ... Каждый может это понять. Спасибо, ncksllvn. Вы экономите мое время ...
— Weraa 05

Как поступить, если идентификатор недействителен?
— Род

21

Я углубился в код, шаг за шагом изучая следующие файлы:

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

Что я нашел:

Нет метода deleteAll, есть метод destroy (), который вы можете вызвать для записи, например:

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

Да, я знал о методе уничтожения, но, к сожалению, это только для одной записи. Думаю, мне придется написать свой собственный метод deleteAll. Спасибо!
— lakenen 06

Действительно странно, что этого не существует. Может быть, вы можете написать это сами и отправить запрос на перенос для продолжения. Я уверен, что другие люди действительно могли бы это использовать.
— alessioalex 06

1
Не стесняйтесь отправить запрос на
— перенос

3
destroy () отсутствует в документации на sequelizejs.com, на случай, если кто-то еще искал это, как и я
— mikermcneil

2
Все ваши ссылки возвращают мне ошибку 404. Я один такой?
— OrwellHindenberg

16

Не знаю, актуален ли вопрос, но я нашел следующее в документации 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

Надеюсь, поможет!


2
Для справки, это определено в lib / model.js , и вам не нужно использовать строку. Вы можете использовать любой whereобъект (например {someId: 123}).
— Domi

10

В этом примере показано, как использовать обещания вместо обратного вызова.

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

Проверьте эту ссылку для получения дополнительной информации http://docs.sequelizejs.com/en/latest/api/model/#destroyoptions-promiseinteger


1
не должно rowDeleted быть 1 при проверке успешного удаления одной строки?
— Сараф

1
Это больше не работает. Возврат - это идентификатор затронутой строки / не количество затронутых строк.
— Тони Батлер

Разве вы не должны использовать catch для обнаружения ошибки вместо обратного вызова?
— Ахмед Гриб

8

В новой версии вы можете попробовать что-то вроде этого

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

Вот пример ES6 с использованием 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;
        }

    }

Обратите внимание, что я использую !!оператор Bang Bang для результата ожидания, который изменит результат на логическое значение.


2

Некоторое время назад я написал что-то подобное для Sails, на случай, если это сэкономит вам время:

Пример использования:

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

Источник:

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

от: orm.js .

Надеюсь, это поможет!


0
  1. лучший способ удалить запись - сначала найти ее (если она существует в базе данных в то же время, когда вы хотите ее удалить)
  2. посмотрите этот код
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

Удалить все, без условий:

Model.destroy({
    truncate: true,
})
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.