Sequelize.js usunąć zapytanie?


99

Czy istnieje sposób na napisanie zapytania delete / deleteAll, takiego jak findAll?

Na przykład chcę zrobić coś takiego (zakładając, że MyModel jest modelem Sequelize ...):

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

Odpowiedzi:


239

Dla każdego, kto używa Sequelize w wersji 3 i nowszych, użyj:

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

Sequelize Documentation - Sequelize Tutorial


To dość stare pytanie, więc wydaje mi się, że w tamtym czasie Sequelize nie miało zaskakująco metody niszczenia
ncksllvn

3
Słusznie; jednak ponieważ jest to pierwszy wynik wyszukiwania w Google, a ludzie są również zniechęcani do zadawania pytań, które zostały już zadane, wydaje się, że zaakceptowana odpowiedź powinna zostać zaktualizowana ... ale to prawdopodobnie bardziej problem dotyczący całej witryny.
Rojuinex

1
Zastanawiam się, że dokumentacja sequelize nie podaje tej bardzo prostej próbki kodowania ... Każdy może to zrozumieć. Dziękuję ncksllvn. Oszczędzasz mój czas ...
weeraa

Jak sobie radzisz, jeśli identyfikator jest nieprawidłowym identyfikatorem?
Rod

21

Szukałem głęboko w kodzie, krok po kroku do następujących plików:

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

Co znalazłem:

Nie ma metody deleteAll, istnieje metoda destru (), którą można wywołać w rekordzie, na przykład:

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

Tak, wiedziałem o metodzie niszczenia, ale niestety to tylko jedna płyta. Myślę, że będę musiał napisać własną metodę deleteAll. Dzięki!
lakenen

Naprawdę dziwne, że to nie istnieje. Może możesz napisać to sam i przesłać prośbę o usunięcie w celu kontynuacji. Jestem pewien, że inni ludzie naprawdę mogliby to wykorzystać.
alessioalex,

1
Zapraszam do przesłania prośby o ściągnięcie lub otwarcia problemu w repozytorium github :)
sdepold

3
Zniszcz () nie ma w dokumentacji na sequelizejs.com, na wypadek, gdyby ktoś inny szukał tego tak jak ja
mikermcneil

2
Twoje linki zwracają mi błędy 404. Czy jestem jedynym?
OrwellHindenberg

16

Nie wiem, czy pytanie jest nadal aktualne, ale w dokumentacji Sequelize znalazłem następujące informacje.

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

Mam nadzieję, że to pomoże!


2
Dla porównania, jest to zdefiniowane w lib / model.js i nie musisz używać łańcucha. Możesz użyć dowolnego rodzaju whereobiektu (np {someId: 123}.).
Domi

10

Ten przykład pokazuje, jak obiecać zamiast oddzwonić.

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

Sprawdź ten link, aby uzyskać więcej informacji http://docs.sequelizejs.com/en/latest/api/model/#destroyoptions-promiseinteger


1
nie powinno rowDeleted być 1 podczas sprawdzania pomyślnego usunięcia jednego wiersza?
saraf

1
To już nie działa. Zwrot to identyfikator wiersza, na który ma to wpływ, a nie liczba wierszy, których to dotyczy.
Tony Butler

Nie powinieneś używać catch do wychwycenia błędu zamiast wywołania zwrotnego?
Ahmed Ghrib

8

W nowej wersji możesz spróbować czegoś takiego

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

Oto przykład ES6 używający 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;
        }

    }

Zwróć uwagę, że używam !!operatora Bang Bang na wyniku oczekiwania, który zmieni wynik na wartość logiczną.


2

Jakiś czas temu napisałem coś takiego dla Sailsów, na wypadek gdyby to zaoszczędziło trochę czasu:

Przykładowe użycie:

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

Źródło:

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

od: orm.js .

Mam nadzieję, że to pomoże!


0
  1. najlepszym sposobem na usunięcie rekordu jest znalezienie go w pierwszej kolejności (jeśli istnieje w bazie danych w tym samym czasie, gdy chcesz go usunąć)
  2. obserwuj ten kod
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

Usuń wszystko, bez warunków:

Model.destroy({
    truncate: true,
})
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.