নোডের সিক্যুয়ালাইজ ব্যবহার করে কীভাবে রেকর্ড আপডেট করবেন?


115

আমি নোডজেএস, এক্সপ্রেস, এক্সপ্রেস-রিসোর্স এবং সিকোলেজ সহ একটি রিসালফুল এপিআই তৈরি করছি যা মাইএসকিউএল ডাটাবেসে সঞ্চিত ডেটাসেট পরিচালনা করতে ব্যবহৃত হয়।

আমি সিকুইলাইজ ব্যবহার করে কীভাবে রেকর্ডটি সঠিকভাবে আপডেট করতে পারি তা জানার চেষ্টা করছি।

আমি একটি মডেল তৈরি:

module.exports = function (sequelize, DataTypes) {
  return sequelize.define('Locale', {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      primaryKey: true
    },
    locale: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      validate: {
        len: 2
      }
    },
    visible: {
      type: DataTypes.BOOLEAN,
      defaultValue: 1
    }
  })
}

তারপরে, আমার সংস্থান নিয়ামকটিতে, আমি একটি আপডেট ক্রিয়া সংজ্ঞায়িত করি।

এখানে আমি রেকর্ডটি আপডেট করতে সক্ষম হতে চাই যেখানে আইডি একটি req.paramsভেরিয়েবলের সাথে মেলে ।

প্রথমে আমি একটি মডেল তৈরি করি এবং তারপরে আমি updateAttributesরেকর্ডটি আপডেট করার জন্য পদ্ধতিটি ব্যবহার করি ।

const Sequelize = require('sequelize')
const { dbconfig } = require('../config.js')

// Initialize database connection
const sequelize = new Sequelize(dbconfig.database, dbconfig.username, dbconfig.password)

// Locale model
const Locales = sequelize.import(__dirname + './models/Locale')

// Create schema if necessary
Locales.sync()


/**
 * PUT /locale/:id
 */

exports.update = function (req, res) {
  if (req.body.name) {
    const loc = Locales.build()

    loc.updateAttributes({
      locale: req.body.name
    })
      .on('success', id => {
        res.json({
          success: true
        }, 200)
      })
      .on('failure', error => {
        throw new Error(error)
      })
  }
  else
    throw new Error('Data not provided')
}

এখন, এটি আসলে আমি যেমনটি প্রত্যাশা করতাম তেমন কোনও আপডেট কোয়েরি তৈরি করে না।

পরিবর্তে, একটি সন্নিবেশ ক্যোয়ারী কার্যকর করা হয়:

INSERT INTO `Locales`(`id`, `locale`, `createdAt`, `updatedAt`, `visible`)
VALUES ('1', 'us', '2011-11-16 05:26:09', '2011-11-16 05:26:15', 1)

সুতরাং আমার প্রশ্নটি: সিকুইলাইজ ওআরএম ব্যবহার করে কোনও রেকর্ড আপডেট করার সঠিক উপায় কী?

উত্তর:


109

আমি সিকুইলাইজ ব্যবহার করি নি , তবে এর ডকুমেন্টেশনগুলি পড়ার পরে, আপনি স্পষ্টতই একটি নতুন অবজেক্টটি ইনস্ট্যান্ট করছেন , সেজন্য সিকুইলাইজ ডিবিতে একটি নতুন রেকর্ড সন্নিবেশ করিয়েছে।

প্রথমে আপনাকে সেই রেকর্ডটি অনুসন্ধান করতে হবে, এটি এনে ফেলতে হবে এবং তারপরেই এর বৈশিষ্ট্যগুলি পরিবর্তন করে আপডেট করতে হবে, উদাহরণস্বরূপ:

Project.find({ where: { title: 'aProject' } })
  .on('success', function (project) {
    // Check if record exists in db
    if (project) {
      project.update({
        title: 'a very different title now'
      })
      .success(function () {})
    }
  })

এটি কাজ করে তবে আমাকে বদলে .successযেতে হয়েছিল.then
অ্যাডাম এফ

1
এটা করা উচিত Project.findOne(?
জেবাকজুক

2
পুরানো প্রশ্ন তবে প্রাসঙ্গিক যদি আজ অনুসন্ধান করা হয় (যেমন আমি করেছি)। সিক্যুইলাইজ 5 হিসাবে, রেকর্ডটি সন্ধানের সঠিক উপায়টি findByPk(req.params.id)যা দিয়ে একটি উদাহরণ দেয়।
ক্রিসটটন

2
এটি সুপারিশ করা উচিত নয়, এটি 2 টি প্রশ্নের পাঠায় যেখানে এটি একক ক্যোয়ারী দ্বারা সম্পন্ন হতে পারে। নীচে অন্যান্য উত্তর চেক করুন।
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

219

সংস্করণ 2.0.0 যেহেতু আপনাকে কোনও সম্পত্তিতে যেখানে ক্লজটি মোড়ানো দরকার where:

Project.update(
  { title: 'a very different title now' },
  { where: { _id: 1 } }
)
  .success(result =>
    handleResult(result)
  )
  .error(err =>
    handleError(err)
  )

আপডেট 2016-03-09

সর্বশেষতম সংস্করণটি আসলে ব্যবহার করে না successএবং এর errorপরিবর্তে ব্যবহারযোগ্য- thenপ্রতিশ্রুতি ব্যবহার করে ।

উপরের কোডটি নীচের মত দেখতে পাবেন:

Project.update(
  { title: 'a very different title now' },
  { where: { _id: 1 } }
)
  .then(result =>
    handleResult(result)
  )
  .catch(err =>
    handleError(err)
  )

অ্যাসিঙ্ক ব্যবহার / অপেক্ষা করুন

try {
  const result = await Project.update(
    { title: 'a very different title now' },
    { where: { _id: 1 } }
  )
  handleResult(result)
} catch (err) {
  handleError(err)
}

http://docs.sequelizejs.com/en/latest/api/model/#updatevalues-options-promisearrayaffectedcount-affectedrows


3
দস্তাবেজগুলিতে স্থানান্তরিত হয়েছে: সিক্যুইলাইজ.ড্রেডহেডসকস.অর্গ
en

প্রথম থ্রেডের উত্তরের চেয়ে আপনার কাছে আরও বেশি সমীক্ষা রয়েছে, আমি মনে করি এটি উত্তর উত্তরগুলির প্রথম উত্তরটিতে স্থানান্তরিত হওয়া উচিত। চিয়ার্স।
আনন্দধাম

37

সিক্যুয়ালাইজ v1.7.0 থেকে আপনি এখন মডেলটিতে একটি আপডেট () পদ্ধতি কল করতে পারেন। অনেক ক্লিনার

উদাহরণ স্বরূপ:

Project.update(

  // Set Attribute values 
        { title:'a very different title now' },

  // Where clause / criteria 
         { _id : 1 }     

 ).success(function() { 

     console.log("Project with id =1 updated successfully!");

 }).error(function(err) { 

     console.log("Project update failed !");
     //handle error here

 });

এই চালানো বৈধতা কি?
মার্কোনি

আমি এপিআই ডক্সে যা পড়েছি তা থেকে এটি পছন্দসই পদ্ধতি।
মাইকেল জে। ক্যালকিনস

4
এটি আসলে হ্রাস করা হয়েছে। মডেলের জন্য সরকারী এপিআই রেফারেন্স দেখুন ।
ডোমি

এই মন্তব্যের সময় হিসাবে এখানে দস্তাবেজগুলি রয়েছে — তারা ReadDDocs এ চলে গেছে।
ক্রিস ক্রিচো

1
উল্লিখিত হিসাবে, এই স্বরলিপিটি ২.০.০. এর পরে অবচিত করা হয়েছে। দয়া করে এই উত্তরটিও দেখুন
ম্যাথিয়াস ডায়েরিচ

22

এবং ডিসেম্বর 2018 এ উত্তর খুঁজছেন এমন লোকদের জন্য, প্রতিশ্রুতি ব্যবহার করে এটি সঠিক বাক্য গঠন:

Project.update(
    // Values to update
    {
        title:  'a very different title now'
    },
    { // Clause
        where: 
        {
            id: 1
        }
    }
).then(count => {
    console.log('Rows updated ' + count);
});

2
এটি শীর্ষ উত্তর হওয়া উচিত।
ডিকোডার 7283

2019 এ কাজ করছে না: আনহ্যান্ডেল প্রত্যাখ্যান ত্রুটি: অবৈধ মান [ফাংশন]
তুষার

13

জানুয়ারী 2020 উত্তর
বোঝার বিষয়টি হ'ল মডেলটির জন্য একটি আপডেট পদ্ধতি এবং একটি দৃষ্টান্তের জন্য একটি পৃথক আপডেট পদ্ধতি (রেকর্ড) রয়েছে। Model.update()সমস্ত মিলে যাওয়া রেকর্ড আপডেট করে এবং সারণী ডকুমেন্টেশন দেখুন একটি অ্যারে ফেরত ।Instance.update()রেকর্ড আপডেট করে এবং একটি উদাহরণ বস্তু দেয়।

সুতরাং প্রশ্ন অনুযায়ী একটি একক রেকর্ড আপডেট করার জন্য কোডটি এরকম কিছু দেখাচ্ছে:

SequlizeModel.findOne({where: {id: 'some-id'}})
.then(record => {
  
  if (!record) {
    throw new Error('No record found')
  }

  console.log(`retrieved record ${JSON.stringify(record,null,2)}`) 

  let values = {
    registered : true,
    email: 'some@email.com',
    name: 'Joe Blogs'
  }
  
  record.update(values).then( updatedRecord => {
    console.log(`updated record ${JSON.stringify(updatedRecord,null,2)}`)
    // login into your DB and confirm update
  })

})
.catch((error) => {
  // do seomthing with the error
  throw new Error(error)
})

সুতরাং, ব্যবহার Model.findOne()বা Model.findByPkId()একটি হ্যান্ডল একটি একক ইন্সটান্স (রেকর্ড) পেতে এবং তারপর ব্যবহারInstance.update()


12

আমি মনে করি UPDATE ... WHEREযে এখানে এবং এখানে বর্ণিত হিসাবে ব্যবহার করা একটি পাতলা পদ্ধতির

Project.update(
      { title: 'a very different title no' } /* set attributes' value */, 
      { where: { _id : 1 }} /* where criteria */
).then(function(affectedRows) {
Project.findAll().then(function(Projects) {
     console.log(Projects) 
})

1
এই গ্রহণযোগ্য উত্তর হতে হবে। আপনি কেবলমাত্র কয়েকটি ক্ষেত্র সেট করতে পারেন এবং আপনি মানদণ্ডটি নির্দিষ্ট করতে পারেন। আপনাকে অনেক ধন্যবাদ :)
লুইস ক্যাবেরা বেনিটো

5

এই সমাধানটি হ্রাস করা হয়

ব্যর্থতা | ব্যর্থ | ত্রুটি () অবমূল্যায়িত হয়েছে এবং ২.১-এ সরানো হবে, দয়া করে পরিবর্তে প্রতিশ্রুতি-স্টাইলটি ব্যবহার করুন।

সুতরাং আপনি ব্যবহার করতে হবে

Project.update(

    // Set Attribute values 
    {
        title: 'a very different title now'
    },

    // Where clause / criteria 
    {
        _id: 1
    }

).then(function() {

    console.log("Project with id =1 updated successfully!");

}).catch(function(e) {
    console.log("Project update failed !");
})

এবং আপনি .complete()পাশাপাশি ব্যবহার করতে পারেন

শুভেচ্ছা সহ


2

অ্যাসিঙ্ক ব্যবহার করে একটি আধুনিক জাভাস্ক্রিপ্ট এস 6 এ অপেক্ষা করুন

const title = "title goes here";
const id = 1;

    try{
    const result = await Project.update(
          { title },
          { where: { id } }
        )
    }.catch(err => console.log(err));

আপনি ফলাফল ফিরে আসতে পারেন ...


1

সর্বজনীন স্ট্যাটিক আপডেট (মান: অবজেক্ট, বিকল্প: অবজেক্ট): প্রতিশ্রুতি>

ডকুমেন্টেশন একবার পরীক্ষা http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-update

  Project.update(
    // Set Attribute values 
    { title:'a very different title now' },
  // Where clause / criteria 
     { _id : 1 }     
  ).then(function(result) { 

 //it returns an array as [affectedCount, affectedRows]

  })

1

আপনি Model.update () পদ্ধতিটি ব্যবহার করতে পারেন।

অ্যাসিঙ্ক / প্রতীক্ষা সহ:

try{
  const result = await Project.update(
    { title: "Updated Title" }, //what going to be updated
    { where: { id: 1 }} // where clause
  )  
} catch (error) {
  // error handling
}

সাথে। তারপর ()। ক্যাচ ():

Project.update(
    { title: "Updated Title" }, //what going to be updated
    { where: { id: 1 }} // where clause
)
.then(result => {
  // code with result
})
.catch(error => {
  // error handling
})

1

হাই খুব সহজ রেকর্ড আপডেট

  1. সিক্যুয়ালাইজ করুন আইডি দ্বারা রেকর্ডটি সন্ধান করুন (বা আপনি যা চান)
  2. তারপরে আপনি পরমগুলি পাস করুন result.feild = updatedField
  3. ডাটাবেস সিক্যুয়ালাইজ করে যদি রেকর্ডটি না করে তবে প্যারামগুলির সাথে একটি নতুন রেকর্ড তৈরি করুন
  4. কোডটি আরও 1 বোঝার জন্য উদাহরণটি দেখুন ভি 1 এর অধীনে সমস্ত সংস্করণের জন্য কোডটি পরীক্ষা করুন
const sequelizeModel = require("../models/sequelizeModel");
    const id = req.params.id;
            sequelizeModel.findAll(id)
            .then((result)=>{
                result.name = updatedName;
                result.lastname = updatedLastname;
                result.price = updatedPrice;
                result.tele = updatedTele;
                return result.save()
            })
            .then((result)=>{
                    console.log("the data was Updated");
                })
            .catch((err)=>{
                console.log("Error : ",err)
            });

ভি 5 এর জন্য কোড

const id = req.params.id;
            const name = req.body.name;
            const lastname = req.body.lastname;
            const tele = req.body.tele;
            const price = req.body.price;
    StudentWork.update(
        {
            name        : name,
            lastname    : lastname,
            tele        : tele,
            price       : price
        },
        {returning: true, where: {id: id} }
      )
            .then((result)=>{
                console.log("data was Updated");
                res.redirect('/');
            })
    .catch((err)=>{
        console.log("Error : ",err)
    });

0

আপনি যদি এখানে কোনও মডেলের একটি নির্দিষ্ট ক্ষেত্রের মান বাড়ানোর উপায় খুঁজছেন ...

এটি আমার পক্ষে কাজ করেছে sequelize@5.21.3

User.increment("field", {by: 1, where: {id: 1});

আরএফ: https://github.com/sequelize/sequelize/issues/7268


0

সিক্যুয়ালাইজে রেকর্ডটি আপডেট করার জন্য দুটি উপায় রয়েছে।

প্রথমত, যদি আপনার কোনও অনন্য শনাক্তকারী থাকে তবে আপনি যেখানে শুল্ক বা অন্যথায় একই পরিচয়কারীটির সাথে একাধিক রেকর্ড আপডেট করতে চান তা ব্যবহার করতে পারেন।

আপনি হয় পুরো অবজেক্ট আপডেট করতে বা একটি নির্দিষ্ট কলাম তৈরি করতে পারেন

const objectToUpdate = {
title: 'Hello World',
description: 'Hello World'
}

models.Locale.update(objectToUpdate, { where: { id: 2}})

শুধুমাত্র একটি নির্দিষ্ট কলাম আপডেট করুন

models.Locale.update({ title: 'Hello World'}, { where: { id: 2}})

দ্বিতীয়ত, আপনি এটি অনুসন্ধান করতে একটি অনুসন্ধান অনুসন্ধান এবং ডিবি আপডেট করার জন্য সেট এবং সেভ ফাংশনটি ব্যবহার করতে পারেন।


const objectToUpdate = {
title: 'Hello World',
description: 'Hello World'
}

models.Locale.findAll({ where: { title: 'Hello World'}}).then((result) => {
   if(result){
   // Result is array because we have used findAll. We can use findOne as well if you want one row and update that.
        result[0].set(objectToUpdate);
        result[0].save(); // This is a promise
}
})

আপডেট বা নতুন সারি তৈরি করার সময় সর্বদা লেনদেন ব্যবহার করুন। কোনও ত্রুটি থাকলে বা কোনও একাধিক আপডেট করা থাকলে এটি কোনও আপডেট ব্যাক করবে:


models.sequelize.transaction((tx) => {
    models.Locale.update(objectToUpdate, { transaction: t, where: {id: 2}});
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.