Düğüm için sekelize kullanarak bir kayıt nasıl güncellenir?


117

MySQL veritabanında depolanan veri kümelerini yönetmek için kullanılan NodeJS, express, express-resource ve Sequelize ile bir RESTful API oluşturuyorum.

Sequelize kullanarak bir kaydı nasıl düzgün şekilde güncelleyeceğimi anlamaya çalışıyorum.

Bir model oluşturuyorum:

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

Ardından, kaynak denetleyicimde bir güncelleme eylemi tanımlıyorum.

Burada id'nin bir req.paramsdeğişkenle eşleştiği kaydı güncelleyebilmek istiyorum .

Önce bir model oluşturuyorum ve ardından updateAttributeskaydı güncellemek için yöntemi kullanıyorum .

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

Şimdi, bu aslında beklediğim gibi bir güncelleme sorgusu üretmiyor.

Bunun yerine, bir ekleme sorgusu yürütülür:

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

Öyleyse sorum şu: Sequelize ORM kullanarak bir kaydı güncellemenin doğru yolu nedir?

Yanıtlar:


110

Ben kullanmadıysanız Sequelize , ancak belgeleri okuduktan sonra, bu olduğu açıktır , yeni bir nesnenin örneğini Sequelize db içine yeni bir kayıt ekler, nedeni bu.

Önce o kaydı aramanız, getirmeniz ve ancak bundan sonra özelliklerini değiştirmeniz ve güncellemeniz gerekir, örneğin:

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

Bu işe yarıyor, ancak değiştirmek .successzorunda kaldım.then
Adam F

1
Olmalı mı Project.findOne(?
JBaczuk

2
Eski soru ama bugün arama yaparsam alakalı (benim yaptığım gibi) Sequelize 5'ten itibaren, kaydı bulmanın doğru yolu, findByPk(req.params.id)bir örnek döndürmedir.
cstrutton

2
Bu tavsiye edilmemelidir, tek sorgu ile yapılabileceği 2 sorgu gönderir. Lütfen aşağıdaki diğer cevapları kontrol edin.
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

219

2.0.0 sürümünden bu yana, where cümlenizi bir whereözellikte sarmalamanız gerekir :

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

Güncelleme 2016-03-09

En son sürüm aslında successve errorartık kullanmıyor , bunun yerine then-able vaatleri kullanıyor .

Dolayısıyla üst kod aşağıdaki gibi görünecektir:

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

Async / await kullanma

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



İlk ileti dizisinden daha fazla olumlu oyunuz var, bence bu yanıt dizisinin ilk yanıtına taşınması gerekiyor. Şerefe.
aananddham

37

Sıralı hale getirme v1.7.0'dan bu yana, artık model üzerinde bir update () yöntemi çağırabilirsiniz. Çok daha temiz

Örneğin:

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

 });

bu da doğrulama çalıştıracak mı?
Marconi

API belgelerinde okuduğuma göre bu tercih edilen yöntemdir.
Michael J. Calkins

4
Aslında kullanımdan kaldırıldı. Model için resmi API Referansına bakın .
Domi

İşte bu yorumun yapıldığı tarih itibariyle dokümanlar - ReadTheDocs'a taşındılar.
Chris Krycho

1
Belirtildiği gibi, bu gösterim 2.0.0'dan beri kullanımdan kaldırılmıştır. Lütfen şu yanıta da bakın: stackoverflow.com/a/26303473/831499
Matthias Dietrich

22

Ve Aralık 2018'de bir cevap arayanlar için bu, vaatleri kullanan doğru sözdizimidir:

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

2
Bu en iyi cevap olmalı.
decoder7283

2019'da çalışmıyor: İşlenmeyen reddetme Hatası: Geçersiz değer [İşlev]
kar

13

Ocak 2020 Cevabı
Anlaşılması gereken şey, Model için bir güncelleme yöntemi ve bir Örnek (kayıt) için ayrı bir güncelleme yöntemi olduğudur. Model.update()TÜM eşleşen kayıtları günceller ve bir dizi döndürür, bakınız Sequelize dokümantasyonu . Instance.update()kaydı günceller ve bir örnek nesnesi döndürür.

Bu nedenle, soru başına tek bir kaydı güncellemek için kod şuna benzer:

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

Bu nedenle, tek bir Örneği (kaydı) ele almak için Model.findOne()veya Model.findByPkId()tuşunu kullanın ve ardındanInstance.update()


model.update (veriler, {burada: {id: 1}}); @kube
dogmatic69'un

12

BuradaUPDATE ... WHERE açıklandığı gibi kullanmayı düşünüyorum ve burada yalın bir yaklaşım

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
Bu kabul edilen cevap olabilir. Bu şekilde yalnızca bazı alanları ayarlayabilir ve kriterleri belirleyebilirsiniz. Çok teşekkür ederim :)
Luis Cabrera Benito

5

Bu çözüm kullanımdan kaldırıldı

error | fail | error () kullanımdan kaldırıldı ve 2.1'de kaldırılacak, bunun yerine lütfen söz stilini kullanın.

yani kullanmak zorundasın

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

Ve kullanabilirsiniz .complete()yanı

Saygılarımızla


2

Zaman uyumsuz kullanarak ve modern bir JavaScript Es6'da bekleyin

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

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

sonucu döndürebilirsiniz ...



1

Model.update () yöntemini kullanabilirsiniz.

Async / await ile:

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

.Then (). Catch () ile:

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

merhaba kaydı güncellemek çok basit

  1. devam ettirmek kaydı kimliğe göre (veya istediğiniz şeye göre) bulun
  2. sonra parametreleri geçersiniz result.feild = updatedField
  3. kayıt veritabanında yoksa, parametrelerle yeni bir kayıt oluştur
  4. Daha fazla anlamak için örneği izleyin Kod # 1, V4 altındaki tüm sürümler için bu kodu test edin
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)
            });

V5 için kod

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

Kaydı ardışık olarak güncellemenin iki yolu vardır.

İlk olarak, benzersiz bir tanımlayıcınız varsa, where cümlesini veya aynı tanımlayıcıyla birden çok kaydı güncellemek istiyorsanız başka bir seçeneği kullanabilirsiniz.

Güncellemek için tüm nesneyi veya belirli bir sütunu oluşturabilirsiniz.

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

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

Yalnızca belirli bir sütunu güncelle

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

İkinci olarak, onu bulmak için bir sorgu bulabilir ve DB'yi güncellemek için ayarla ve kaydet işlevini kullanabilirsiniz.


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

Yeni bir satırı güncellerken veya oluştururken her zaman işlemi kullanın. bu şekilde, herhangi bir hata varsa veya birden fazla güncelleme yapıyorsanız, güncellemeleri geri alır:


models.sequelize.transaction((tx) => {
    models.Locale.update(objectToUpdate, { transaction: t, where: {id: 2}});
})
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.