Sequelize.js видалити запит?


99

Чи є спосіб написати видалення / видалитиВсі запити, такі як findAll?

Наприклад, я хочу зробити щось подібне (припустимо, що MyModel - модель Sequelize ...):

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

Відповіді:


237

Для тих, хто використовує Sequelize версії 3 і вище, використовуйте:

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

Sequelize Documentation - Sequelize Tutorial


Це досить давнє запитання, тому на той момент я гадаю, що у Sequelize не було напрочуд методу знищення
ncksllvn

3
Досить справедливо; хоча, оскільки це перший результат пошуку в Google, і людей також не рекомендують задавати вже задані питання, здається, що прийнята відповідь повинна оновлюватися ... але це, мабуть, більша проблема для всього сайту.
Rojuinex

1
Мені цікаво, що документація про наслідки не дає, це набагато простіший зразок кодування ... Будь-хто може це зрозуміти. Дякую ncksllvn. Ви економите мій час ...
weeraa

Як вам вчинити, якщо ідентифікатор недійсний?
Прут

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, є метод delete (), який ви можете викликати в записі, наприклад:

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

Так, я знав про метод знищення, але, на жаль, це лише для одного запису. Думаю, мені доведеться написати власний метод deleteAll. Дякую!
lakenen

Дійсно дивно, що цього не існує. Можливо, ви можете написати це самостійно та подати запит на розірвання. Я впевнений, що інші люди могли реально ним користуватися.
alessioalex

1
Не соромтеся подавати запит на витяг або відкривати випуск у сховищі github :)
sdepold

3
знищити () немає в документації на 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}).
Домі

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
Це вже не працює так. Повернення - це ідентифікатор рядка, на який впливає / не кількість рядків, на які це впливає.
Тоні Батлер

Чи не слід використовувати уловлювання для лову помилки замість зворотного дзвінка?
Ахмед Гриб

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

Я щось подібне написав для Вітрил на той час, якщо це заощадить певний час:

Приклад використання:

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