Sequelize.js কোয়েরি মুছবেন?


101

ফাইন্ডএল-এর মতো মুছে ফেলা / মুছার সমস্ত কোয়েরি লেখার কোনও উপায় আছে কি?

উদাহরণস্বরূপ, আমি এর মতো কিছু করতে চাই (ধরে নিই মাইমোডেল একটি সিক্যুয়ালাইজ মডেল ...):

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

উত্তর:


248

3 বা তদূর্ধের সিক্যুইলাইজ সংস্করণ ব্যবহার করার জন্য, ব্যবহার করুন:

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

সিকুয়েলাইজ ডকুমেন্টেশন - সিকুয়ালাইজ টিউটোরিয়াল


এটি একটি বেশ পুরানো প্রশ্ন তাই আমার অনুমানের সময় সিকিলিজের আশ্চর্যরূপে কোনও ধ্বংসের পদ্ধতি ছিল না
ncksllvn

4
যথেষ্ট ফর্সা; যদিও গুগলে এটি প্রথম অনুসন্ধানের ফলাফল, এবং লোকেরা এমন প্রশ্ন জিজ্ঞাসা করা থেকে নিরুৎসাহিত করা হয়েছে যা ইতিমধ্যে জিজ্ঞাসা করা হয়েছে এটি মনে হয় গ্রহণযোগ্য উত্তরটি আপডেট হওয়া উচিত ... তবে এটি সম্ভবত সাইট বিস্তৃত সমস্যা more
রোজুইনেক্স

4
আমি ভাবছি সিক্যুয়ালাইজ ডকুমেন্টেশন দেয় না, এটি বেশ সহজ কোডিংয়ের নমুনা ... যে কেউ এটি বুঝতে পারে। ধন্যবাদ ncksllvn। আপনি আমার সময় বাঁচান ...
সপ্তাহের

আইডি যদি অবৈধ আইডি হয় তবে আপনি কীভাবে পরিচালনা করবেন?
রোড

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

হ্যাঁ, আমি ধ্বংস পদ্ধতি সম্পর্কে জানতাম, তবে দুর্ভাগ্যক্রমে এটি কেবল একটি রেকর্ডের জন্য। আমার ধারণা আমার নিজের মুছে ফেলা সমস্ত পদ্ধতি লিখতে হবে। ধন্যবাদ!
লাকেনেন

সত্যিই অদ্ভুত যে এর অস্তিত্ব নেই। হতে পারে আপনি নিজে এটি লিখতে পারেন এবং সিক্যুয়ালাইজ করার জন্য একটি টান অনুরোধ জমা দিতে পারেন। আমি নিশ্চিত যে অন্যান্য লোকেরা সত্যই এটি ব্যবহার করতে পারে।
এলেসিয়োএলেক্স

4
টানা অনুরোধ জমা দিতে বা
গিথুব

4
ধ্বংস () সিক্যুইলিজজ.কম এ ডকুমেন্টেশনে নেই, যদি অন্য কেউ এখানে
থাকত

4
আপনার লিঙ্কগুলি আমার জন্য 404 গুলি ফিরিয়ে দিচ্ছে। আমি শুধু এক নই?
অরওয়েলহিনডেনবার্গ

16

প্রশ্নটি এখনও প্রাসঙ্গিক কিনা তা আপনি জানেন না তবে সিকুইলাইজের ডকুমেন্টেশনে আমি নিম্নলিখিতটি পেয়েছি।

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

আশা করি এটা সাহায্য করবে!


4
রেফারেন্সের জন্য, এটি lib / Model.js এ সংজ্ঞায়িত করা হয়েছে , এবং আপনাকে স্ট্রিং ব্যবহার করতে হবে না। আপনি যেকোন ধরণের whereঅবজেক্ট (উদাহরণস্বরূপ {someId: 123}) ব্যবহার করতে পারেন ।
ডোমি

11

এই উদাহরণটি আপনাকে কলব্যাকের পরিবর্তে প্রতিশ্রুতি দেবে তা দেখায়।

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.sequelizejs.com/en/latest/api/model/#destroyoptions-promiseinteger


4
একটি সারি সফল মোছার জন্য পরীক্ষা করার সময় সারিটি 1 টি মুছে ফেলা উচিত নয়?
saraf

4
এটি আর সেই রকম কাজ করে না। রিটার্নটি সারি আইডি প্রভাবিত হয় / প্রভাবিত সারিগুলির গণনা নয়।
টনি বাটলার

আপনি কি কলব্যাকের পরিবর্তে ত্রুটি ধরতে ক্যাচ ব্যবহার করবেন না?
আহমেদ গরিব

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

5

এখানে ইয়েট / অ্যাসিঙ্ক উদাহরণ ব্যবহার করে একটি 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

আশা করি এইটি কাজ করবে!


1

আমি সিকেলাইজ.জেএস, নোড.জেএস এবং লেনদেন নীচের কোডে ব্যবহার করেছি এবং সঠিক ত্রুটি পরিচালনা করতে যুক্ত করেছি যদি এটি ডেটা না খুঁজে দেয় তবে এটি ত্রুটি ছুঁড়ে দেবে যে আইডির সাথে কোনও ডেটা পাওয়া যায় নি

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. কোনও রেকর্ড মুছে ফেলার সর্বোত্তম উপায় হ'ল এটি প্রথমত সন্ধান করা (যদি আপনি এটি মুছতে চান একই সময়ে ডেটা বেসে উপস্থিত থাকেন)
  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,
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.