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

99

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

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

MyModel.deleteAll({ where: ['some_field != ?', something] })
    .on('success', function() { /* ... */ });
Lakenen
источник

Ответы:

240

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

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

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

ncksllvn
источник
Это довольно старый вопрос, поэтому я думаю, что в то время у 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

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

cgiacomi
источник
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);
        });
Adiii
источник
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 для результата ожидания, который изменит результат на логическое значение.

li x
источник
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 .

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

Mikermcneil
источник
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,
})
S ..
источник