Sequelize.js sorgu silinsin mi?


101

FindAll gibi bir delete / deleteAll sorgusu yazmanın bir yolu var mı?

Örneğin şöyle bir şey yapmak istiyorum (MyModel'in bir Sequelize modeli olduğunu varsayarak ...):

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

Yanıtlar:


248

Sequelize sürüm 3 ve üstünü kullanan herkes için şunları kullanın:

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

Sequelize Belgeleri - Sequelize Eğitimi


Oldukça eski bir soru, o yüzden Sequelize'nin şaşırtıcı bir şekilde yok etme yöntemi olmadığını tahmin ediyorum
ncksllvn

3
Yeterince adil; ancak bu Google'daki ilk arama sonucu olduğundan ve insanların daha önce sorulmuş soruları sormaktan caydırılmasından dolayı, kabul edilen yanıtın güncellenmesi gerekiyor gibi görünüyor ... ama bu muhtemelen site çapında bir sorun.
Rojuinex

1
Merak ediyorum, belgelerin devamı vermiyor, bu çok oldukça kolay kodlama örneği ... Bunu herkes anlayabilir. Teşekkür ederim ncksllvn.
Zamanımı kurtarırsın

Kimlik geçersiz bir id ise nasıl idare edilir?
Rod

21

Aşağıdaki dosyaları adım adım derinlemesine araştırdım:

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

Bulduğum:

DeleteAll yöntemi yoktur, bir kayıtta çağırabileceğiniz bir destroy () yöntemi vardır, örneğin:

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

Evet, yok etme yöntemini biliyordum ama maalesef bu sadece bir kayıt için. Sanırım kendi deleteAll yöntemimi yazmam gerekecek. Teşekkürler!
lakenen

Bunun olmaması gerçekten garip. Belki kendiniz yazabilir ve devamı için bir talepte bulunabilirsiniz. Eminim diğer insanlar gerçekten kullanabilir.
alessioalex

1
Çekme isteği göndermekten veya github deposunda bir sorun
açmaktan çekinmeyin

3
benim gibi başka durumda herkes, sequelizejs.com üzerinde belgelerinde değildir) (yok burada o arıyordu
mikermcneil

2
Bağlantılarınız benim için 404'leri döndürüyor. Tek kişi ben miyim?
OrwellHindenberg

16

Sorunun hala geçerli olup olmadığını bilmiyorum ama Sequelize'nin belgelerinde aşağıdakileri buldum.

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

Umarım yardımcı olur!


2
Referans olarak, bu lib / model.js'de tanımlanmıştır ve bir dizge kullanmanız gerekmez. Her türlü wherenesneyi kullanabilirsiniz (örneğin {someId: 123}).
Domi

11

Bu örnek, geri arama yerine nasıl söz verdiğinizi gösterir.

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

Daha fazla bilgi için bu bağlantıya göz atın http://docs.sequelizejs.com/en/latest/api/model/#destroyoptions-promiseinteger


1
Bir satırın başarılı bir şekilde silinmesini kontrol ederken rowDeleted 1 olmalıdır?
saraf

1
Bu artık böyle çalışmıyor. Dönüş, etkilenen satır kimliğidir / etkilenen satırların sayısı değildir.
Tony Butler

Hatayı geri arama yerine yakalamak için catch kullanmanız gerekmez mi?
Ahmed Ghrib

8

Yeni versiyonda bunun gibi bir şey deneyebilirsiniz

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

5

Await / Async örneğini kullanan bir ES6:

    async deleteProduct(id) {

        if (!id) {
            return {msg: 'No Id specified..', payload: 1};
        }

        try {
            return !!await products.destroy({
                where: {
                    id: id
                }
            });
        } catch (e) {
            return false;
        }

    }

!!Bekleme sonucunda, sonucu Boolean'a çevirecek olan Bang Bang Operatörünü kullandığımı lütfen unutmayın .


2

Size biraz zaman kazandırması ihtimaline karşı bir süre önce Sails için şöyle bir şey yazmıştım:

Örnek kullanım:

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

Kaynak:

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

dan: orm.js .

Umarım yardımcı olur!


1

Aşağıdaki kodda sequelize.js, node.js ve işlemi kullandım ve uygun hata işlemeyi ekledim, eğer veri bulamazsa, bu id ile hiçbir veri bulunamadı hatası atacak

deleteMyModel: async (req, res) => {

    sequelize.sequelize.transaction(async (t1) => {

        if (!req.body.id) {
            return res.status(500).send(error.MANDATORY_FIELDS);
        }

        let feature = await sequelize.MyModel.findOne({
            where: {
                id: req.body.id
            }
        })

        if (feature) {
            let feature = await sequelize.MyModel.destroy({
                where: {
                    id: req.body.id
                }
            });

            let result = error.OK;
            result.data = MyModel;
            return res.status(200).send(result);

        } else {
            return res.status(404).send(error.DATA_NOT_FOUND);
        }
    }).catch(function (err) {
        return res.status(500).send(error.SERVER_ERROR);
    });
}

0
  1. Bir kaydı silmenin en iyi yolu, öncelikle onu bulmaktır (eğer veri tabanında varsa, aynı zamanda silmek istiyorsanız)
  2. bu kodu izle
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

Tümünü sil, koşul yok:

Model.destroy({
    truncate: true,
})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.