【问题标题】:How to update an array in Sequelize Postgres如何在 Sequelize Postgres 中更新数组
【发布时间】:2022-01-10 18:22:03
【问题描述】:

我在 Sequelize 中有一个用于 Postgres 数据库的用户模型:

var User = sequelize.define('User', {
fb_id: DataTypes.STRING,
access_token: DataTypes.TEXT,
first_name: DataTypes.STRING,
last_name: DataTypes.STRING,
email: DataTypes.TEXT,
profilePictureURL: DataTypes.TEXT,
library: DataTypes.ARRAY(DataTypes.STRING)
}, {
underscored: true,
classMethods: {
  associate: function(models) {

   }
 }
  });

我正在尝试通过将 ISBN 添加到数组来更新库字段。这是我的 POST 请求的代码:

req.user.library.push(req.body._isbn); // adding the posted ISBN to the user object in my express-session

User.findOrCreate({where: {fb_id: req.user.fb_id}, 
        defaults: {
            access_token :      req.user.access_token,                 
            first_name :        req.user.first_name,
            last_name :         req.user.last_name,
            email :             req.user.email, 
            profilePictureURL : req.user.profilePictureURL,
            library: req.user.library // new library object
        }})
        .spread(function (updatedUser, created){
            res.status(200).json(updatedUser);
        }).error(function(err){
            res.status(500).json(err);
        });

没有错误,但是在检查 updatedUser 对象后库字段没有更新。如何正确更新 Sequelize 中的数组字段?

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    对于下一个访问者,我可能已经找到了解决此问题的更好方法:

    User.update(
     {library: Sequelize.fn('array_append', Sequelize.col('library'), req.body._isbn)},
     {where: {fb_id: req.user.fb_id}}
    );
    

    【讨论】:

    • 发布代码很棒,但请尝试添加一些文字来描述您所做的事情。
    【解决方案2】:

    我之前遇到过这个问题,并在他们的 Github 问题中找到了答案。我实现它的方式是

    User.find({
      where: {
        fb_id: req.user.fb_id
      }
    })
    .then((user) => {
      user.library.push(req.body._isbn)
      user.update({
        library: user.library
      },{
        where: {
          fb_id: req.user.fb_id
        }
      })
      .then(user => res.json(user))
    })
    

    感觉肯定有更好的方法,但我是这样找到方法的。

    【讨论】:

      【解决方案3】:

      有点老问题,但我找到了一种解决方法,将来可能会有所帮助,据我了解,sequelize 可能无法将更新的数据识别为新实例,因此它只会将其视为本地范围。我的解决方案是在所需的数组上创建一个新对象,例如:

      let newArray = Object.assign([], instance.arrayToUpdate);
      
      newArray.push(myInterestingData)
      await instance.update({
        arrayToUpdate: newArray
      });
      

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 2021-04-24
        • 2016-04-17
        • 1970-01-01
        • 1970-01-01
        • 2019-03-10
        相关资源
        最近更新 更多