Sequelize.js क्वेरी हटाएं?


99

क्या FindAll जैसी डिलीट / डिलीट क्वेरी को लिखने का कोई तरीका है?

उदाहरण के लिए मैं ऐसा कुछ करना चाहता हूं (यह मानते हुए कि MyModel एक Sequelize मॉडल है ...):

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

जवाबों:


239

Sequelize संस्करण 3 और इसके बाद के संस्करण का उपयोग करने वाले किसी के लिए, उपयोग करें:

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

सीक्वेलाइज डॉक्यूमेंटेशन - सीक्वेलाइज ट्यूटोरियल


यह एक बहुत पुराना सवाल है, इसलिए मुझे लगता है कि सीक्वेलाइज़ में आश्चर्यजनक रूप से विनाश विधि नहीं थी
ncsllvn

3
काफी उचित; हालाँकि, यह Google पर पहला खोज परिणाम है, और लोगों को ऐसे प्रश्न पूछने से भी हतोत्साहित किया जाता है, जो पहले से ही पूछ चुके हैं, ऐसा लगता है कि स्वीकृत उत्तर को अपडेट किया जाना चाहिए ... लेकिन यह शायद एक साइट के व्यापक मुद्दे से अधिक है।
रौजिनेक्स

1
मैं सोच रहा था कि सीक्वल डाक्यूमेंटेशन नहीं देता, यह बहुत आसान कोडिंग नमूना है ... कोई भी इसे समझ सकता है। धन्यवाद nksllvn तुम मेरा समय बचाओ ...
वीर

यदि आईडी अमान्य आईडी है तो आप कैसे संभालेंगे?
रॉड

21

मैंने कोड को गहराई से खोजा है, चरणबद्ध तरीके से निम्नलिखित फाइलों में:

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

मुझे क्या मिला:

कोई डिलीट विधि नहीं है, एक नष्ट () विधि है जिसे आप रिकॉर्ड पर कॉल कर सकते हैं, उदाहरण के लिए:

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

हाँ, मुझे नष्ट करने की विधि के बारे में पता था, लेकिन दुर्भाग्य से यह केवल एक रिकॉर्ड के लिए है। मुझे लगता है कि मुझे अपनी स्वयं की हटाने की विधि लिखनी होगी। धन्यवाद!
प्रात

वास्तव में अजीब है कि यह मौजूद नहीं है। हो सकता है कि आप इसे स्वयं लिख सकें और अगली कड़ी बनाने के लिए एक पुल अनुरोध प्रस्तुत कर सकें। मुझे यकीन है कि अन्य लोग वास्तव में इसका इस्तेमाल कर सकते हैं।
ऐलेसियोलेक्स

1
बेझिझक एक पुल अनुरोध सबमिट करें या
गितुब

3
नष्ट करना () सीक्वलजेज डॉट कॉम पर प्रलेखन में नहीं है, अगर किसी और को यहाँ देख रहा था तो मुझे भी पसंद आ रहा था
mikermcneil

2
आपके लिंक सभी मेरे लिए 404 लौटा रहे हैं। क्या केवल मैं ही हूं?
ओरवेलहिंडेनबर्ग

16

यह नहीं जानते कि क्या प्रश्न अभी भी प्रासंगिक है, लेकिन मुझे 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

आशा करता हूँ की ये काम करेगा!


2
संदर्भ के लिए, यह lib / model.js में परिभाषित किया गया है , और आपको एक स्ट्रिंग का उपयोग करने की आवश्यकता नहीं है। आप किसी भी प्रकार की whereवस्तु (जैसे {someId: 123}) का उपयोग कर सकते हैं ।
डोमी

10

यह उदाहरण दिखाता है कि कॉलबैक के बजाय आप कैसे वादे करते हैं।

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

अधिक जानकारी के लिए इस लिंक को देखें http://docs.fterelizejs.com/en/latest/api/model/#destroyoptions-promiseinteger


1
एक पंक्ति के सफल विलोपन के लिए जाँच करते समय पंक्तिबद्ध नहीं होना चाहिए?
सरफ

1
यह अब उस तरह काम नहीं करता है। वापसी पंक्ति ID प्रभावित / प्रभावित पंक्तियों की गिनती नहीं है।
टोनी बटलर

क्या आपको कॉलबैक के बजाय त्रुटि को पकड़ने के लिए उपयोग नहीं करना चाहिए?
अहमद ग़रीब

8

नए संस्करण में, आप कुछ इस तरह की कोशिश कर सकते हैं

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

यहाँ Await / Async उदाहरण का उपयोग कर एक 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;
        }

    }

कृपया ध्यान दें कि मैं !!बैंग बैंग ऑपरेटर का उपयोग प्रतीक्षा के परिणाम पर कर रहा हूं जो परिणाम को बूलियन में बदल देगा।


2

मैंने कुछ समय पहले सेल्स के लिए ऐसा कुछ लिखा था, अगर यह आपको कुछ समय बचाता है:

उदाहरण का उपयोग:

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

स्रोत:

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

से: orm.js

उम्मीद है की वो मदद करदे!


0
  1. किसी रिकॉर्ड को हटाने का सबसे अच्छा तरीका यह है कि आप इसे पहले पाएं (यदि आप उसी समय डेटा बेस में मौजूद हैं जिसे आप इसे हटाना चाहते हैं)
  2. इस कोड को देखें
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

सभी हटाएँ, कोई भी स्थिति नहीं:

Model.destroy({
    truncate: true,
})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.