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() { /* ... */ });
lakenen
sumber

Jawaban:

236

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

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

Sequelize Documentation - Sequelize Tutorial

ncksllvn
sumber
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
    }
  })
})
alessioalex.dll
sumber
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!

cgiacomi.dll
sumber
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

Hisham Haniffa
sumber
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);
        });
Adiii
sumber
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.

li x
sumber
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!

mikermcneil.dll
sumber
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));
bahri noredine
sumber
0

Hapus semua, tanpa syarat:

Model.destroy({
    truncate: true,
})
S ..
sumber