首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用sequelize for node更新记录?

如何使用sequelize for node更新记录?
EN

Stack Overflow用户
提问于 2011-11-17 04:31:07
回答 14查看 339.7K关注 0票数 156

我正在使用NodeJS、express、express-resource和Sequelize创建一个RESTful应用程序接口,用于管理存储在MySQL数据库中的数据集。

我正在尝试弄清楚如何使用Sequelize正确地更新记录。

我创建了一个模型:

代码语言:javascript
复制
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
    }
  })
}

然后,在我的资源控制器中,我定义了一个更新操作。

在这里,我希望能够更新id与req.params变量匹配的记录。

首先,我构建一个模型,然后使用updateAttributes方法更新记录。

代码语言:javascript
复制
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查询:

代码语言:javascript
复制
INSERT INTO `Locales`(`id`, `locale`, `createdAt`, `updatedAt`, `visible`)
VALUES ('1', 'us', '2011-11-16 05:26:09', '2011-11-16 05:26:15', 1)

所以我的问题是:使用Sequelize ORM更新记录的正确方法是什么?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2011-11-17 04:50:24

我没有使用过Sequelize,但在阅读了它的文档之后,很明显你是instantiating a new object,这就是为什么Sequelize会在数据库中插入一条新的记录。

首先,您需要搜索该记录,获取它,然后更改其属性并对其执行update操作,例如:

代码语言:javascript
复制
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 () {})
    }
  })
票数 129
EN

Stack Overflow用户

发布于 2014-01-03 11:22:46

从sequelize v1.7.0开始,您现在可以在模型上调用update()方法。干净多了

例如:

代码语言:javascript
复制
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

 });
票数 39
EN

Stack Overflow用户

发布于 2018-12-06 01:15:11

对于那些在2018年12月寻找答案的人来说,这是使用promises的正确语法:

代码语言:javascript
复制
Project.update(
    // Values to update
    {
        title:  'a very different title now'
    },
    { // Clause
        where: 
        {
            id: 1
        }
    }
).then(count => {
    console.log('Rows updated ' + count);
});
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8158244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档