Sequelize.js hapus kueri?


99

Apakah ada cara untuk menulis kueri delete / deleteAll seperti findAll?

Misalnya saya ingin melakukan sesuatu seperti ini (dengan asumsi MyModel adalah model Sequelize ...):

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

Jawaban:


236

Untuk siapa saja yang menggunakan Sequelize versi 3 ke atas, gunakan:

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

Sequelize Documentation - Sequelize Tutorial


Ini pertanyaan yang cukup lama jadi pada saat itu saya kira Sequelize tidak memiliki metode penghancuran yang mengejutkan
ncksllvn

3
Cukup adil; meskipun karena ini adalah hasil pencarian pertama di Google, dan orang-orang juga tidak disarankan untuk mengajukan pertanyaan yang telah diajukan, sepertinya jawaban yang diterima harus diperbarui ... tetapi itu mungkin lebih merupakan masalah seluruh situs.
Rojuinex

1
Saya bertanya-tanya dokumentasi sekuel tidak memberikan, contoh pengkodean yang cukup mudah ini ... Siapa pun dapat memahami ini. Terima kasih ncksllvn. Anda menghemat waktu saya ...
weeraa

Bagaimana Anda menangani jika id adalah id tidak valid?
Batang

21

Saya telah mencari jauh ke dalam kode, selangkah demi selangkah ke file berikut:

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

Apa yang kutemukan:

Tidak ada metode deleteAll, ada metode destruksi () yang bisa Anda panggil dalam rekaman, misalnya:

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

Ya, saya tahu tentang metode penghancuran, tapi sayangnya itu hanya untuk satu catatan. Saya rasa saya harus menulis metode deleteAll saya sendiri. Terima kasih!
lakenen

Sangat aneh bahwa ini tidak ada. Mungkin Anda bisa menulisnya sendiri dan mengirimkan permintaan tarik untuk sekuel. Saya yakin orang lain benar-benar bisa menggunakannya.
alessioalex

1
Jangan ragu untuk mengirimkan permintaan penarikan atau untuk membuka masalah di repositori github :)
sdepold

3
destroy () tidak ada dalam dokumentasi di sequelizejs.com, kalau-kalau ada orang lain di sini yang mencari itu seperti saya
mikermcneil

2
Tautan Anda semuanya mengembalikan 404 untuk saya. Apakah saya satu-satunya?
OrwellHindenberg

16

Tidak tahu apakah pertanyaannya masih relevan tetapi saya telah menemukan yang berikut di dokumentasi 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

Semoga membantu!


2
Untuk referensi, ini didefinisikan di lib / model.js , dan Anda tidak perlu menggunakan string. Anda dapat menggunakan objek apa pun where(misalnya {someId: 123}).
Domi

10

Contoh ini menunjukkan bagaimana Anda menjanjikan alih-alih panggilan balik.

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

Lihat tautan ini untuk info lebih lanjut http://docs.sequelizejs.com/en/latest/api/model/#destroyoptions-promiseinteger


1
bukankah seharusnya rowDeleted menjadi 1 saat memeriksa penghapusan satu baris yang berhasil?
saraf

1
Ini tidak lagi berfungsi seperti itu. Kembali adalah ID baris yang terpengaruh / bukan jumlah baris yang terpengaruh.
Tony Butler

Tidakkah sebaiknya Anda menggunakan catch untuk menangkap error alih-alih callback?
Ahmed Ghrib

8

Dalam versi baru, Anda dapat mencoba sesuatu seperti ini

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

Berikut ES6 menggunakan contoh 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;
        }

    }

Harap dicatat bahwa saya menggunakan !!Bang Bang Operator pada hasil menunggu yang akan mengubah hasilnya menjadi Boolean.


2

Saya menulis sesuatu seperti ini untuk Sails beberapa waktu yang lalu, seandainya itu menghemat waktu Anda:

Contoh penggunaan:

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

Sumber:

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

dari: orm.js .

Semoga membantu!


0
  1. cara terbaik untuk menghapus record adalah dengan menemukannya terlebih dahulu (jika ada di basis data pada saat yang sama Anda ingin menghapusnya)
  2. perhatikan kode ini
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

Hapus semua, tanpa syarat:

Model.destroy({
    truncate: true,
})
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.