Truy vấn xóa Sequelize.js?


99

Có cách nào để viết một truy vấn delete / deleteAll như findAll không?

Ví dụ: tôi muốn làm điều gì đó như thế này (giả sử MyModel là mô hình Sequelize ...):

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

Câu trả lời:


236

Đối với bất kỳ ai sử dụng Sequelize phiên bản 3 trở lên, hãy sử dụng:

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

Sequelize Documentation - Sequelize Tutorial


Đó là một câu hỏi khá cũ nên vào thời điểm đó tôi đoán Sequelize không có một phương pháp phá hủy đáng ngạc nhiên
ncksllvn

3
Đủ công bằng; mặc dù vì đây là kết quả tìm kiếm đầu tiên trên Google và mọi người cũng không khuyến khích đặt những câu hỏi đã được hỏi nên có vẻ như câu trả lời được chấp nhận sẽ được cập nhật ... nhưng đó có lẽ là vấn đề nhiều hơn trên toàn bộ trang web.
Rojuinex

1
Tôi tự hỏi tài liệu về phần tiếp theo không cung cấp, mẫu mã hóa khá dễ dàng này ... Bất kỳ ai cũng có thể hiểu điều này. Xin cảm ơn ncksllvn. Bạn tiết kiệm thời gian của tôi ...
December

Bạn xử lý như thế nào nếu id là id không hợp lệ?
Rod

21

Tôi đã tìm kiếm sâu vào mã, từng bước vào các tệp sau:

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

Những gì tôi tìm thấy:

Không có phương thức deleteAll, có một phương thức hủy () bạn có thể gọi trên bản ghi, ví dụ:

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

Vâng, tôi biết về phương pháp phá hủy, nhưng tiếc là nó chỉ dành cho một bản ghi. Tôi đoán tôi sẽ phải viết phương thức deleteAll của riêng mình. Cảm ơn!
Lakenen

Thực sự kỳ lạ rằng điều này không tồn tại. Có thể bạn có thể tự viết nó và gửi yêu cầu kéo để tiếp tục. Tôi chắc rằng những người khác thực sự có thể sử dụng nó.
alessioalex

1
Vui lòng gửi yêu cầu kéo hoặc mở vấn đề trong kho lưu trữ github :)
sdepold

3
tiêu diệt () không có trong các tài liệu về sequelizejs.com, trong trường hợp bất cứ ai khác đã ở đây tìm kiếm mà như tôi đã
mikermcneil

2
Các liên kết của bạn đều trả về 404s cho tôi. Tôi là người duy nhất à?
OrwellHindenberg

16

Không biết câu hỏi có còn liên quan không nhưng tôi đã tìm thấy những điều sau trên tài liệu của 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

Hy vọng nó giúp!


2
Để tham khảo, điều này được định nghĩa trong lib / model.js và bạn không cần phải sử dụng một chuỗi. Bạn có thể sử dụng bất kỳ loại wheređối tượng nào (ví dụ {someId: 123}).
Domi

10

Ví dụ này cho thấy cách bạn hứa thay vì gọi lại.

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

Kiểm tra liên kết này để biết thêm thông tin http://docs.sequelizejs.com/en/latest/api/model/#destroyoptions-promiseinteger


1
không nên rowDeleted là 1 khi kiểm tra việc xóa thành công một hàng?
saraf

1
Điều này không còn hoạt động như vậy nữa. Trả về là ID hàng bị ảnh hưởng / không phải là số lượng hàng bị ảnh hưởng.
Tony Butler

Bạn không nên sử dụng hàm catch để bắt lỗi thay vì gọi lại?
Ahmed Ghrib

7

Trong phiên bản mới, bạn có thể thử một cái gì đó như thế này

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

Đây là một ES6 sử dụng ví dụ 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;
        }

    }

Xin lưu ý rằng tôi đang sử dụng !!Toán tử Bang Bang trên kết quả của thời gian chờ sẽ thay đổi kết quả thành Boolean.


2

Tôi đã viết một cái gì đó như thế này cho Sails một thời gian trước, trong trường hợp nó giúp bạn tiết kiệm thời gian:

Ví dụ sử dụng:

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

Nguồn:

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

từ: orm.js .

Hy vọng rằng sẽ giúp!


0
  1. cách tốt nhất để xóa một bản ghi là tìm nó trước (nếu tồn tại trong cơ sở dữ liệu trong cùng thời điểm bạn muốn xóa nó)
  2. xem mã này
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

Xóa tất cả, không có điều kiện:

Model.destroy({
    truncate: true,
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.