【问题标题】:Sequelize - how to insert data into multiple tables?Sequelize - 如何将数据插入多个表?
【发布时间】:2020-07-06 23:51:23
【问题描述】:

我是使用 Sequelize 的新手,我遇到了一个我不明白为什么会发生的问题。我正在尝试创建一个新用户,用户的数据在两个表中定义。一个是 user 表,其中包含一般用户的信息,例如名字、姓氏、电子邮件等。另一个表包含用户的设置,例如用户想要使用的配色方案等。这些表的模型如下所示。

用户模型:

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('user', {
    user_id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true,
      allowNull: false
    },
    firstname: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    lastname: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    email: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: {
        args: true,
      },
    },
    password: {
      type: DataTypes.STRING,
      allowNull: false,
    }
  }
);

  return User;
};

用户设置模型:

module.exports = (sequelize, DataTypes) => {
    const UserSettings = sequelize.define('user_settings', {
        user_id: {
            type: DataTypes.INTEGER,
            unique: true,
            allowNull: false
        },
        wants_update_notification: {
            type: DataTypes.BOOLEAN,
            allowNull: false
        },
        color_scheme: {
            type: DataTypes.INTEGER,
            allowNull: false 
        }
    });

    UserSettings.associate = (models) => {
        UserSettings.belongsTo(models.User, { foreignKey: 'user_id', as: 'user' });
    };
    
    return UserSettings;
} 

现在,当我尝试创建新用户时,服务器会通过端点的主体获取一般用户的信息。使用此信息,服务器创建一个新用户。接下来我将默认用户设置添加到创建的用户返回的对象中,并尝试将数据插入到用户设置表中,如下所示:

let theUser = await sequelizeConnection.models.user.create(req.body);

theUser.wants_update_notification = false;
theUser.color_scheme = 0;

await sequelizeConnection.models.user_settings.create(theUser);

但是,这会返回错误:user_settings.user_id cannot be null。我觉得这很奇怪,因为 user_id 是由用户模型的 create 方法返回的。如果我记录theUser 的内容,我可以清楚地看到存在一个user_id。这是怎么回事?

【问题讨论】:

    标签: sequelize.js


    【解决方案1】:

    您正在尝试将 Wants_update_notification 和 color_scheme 添加到 user 而不是 user_settings

    let theUser = await sequelizeConnection.models.user.create(req.body); // theUser is a user model instance
    
    theUser.wants_update_notification = false; // here!
    theUser.color_scheme = 0;
    
    await sequelizeConnection.models.user_settings.create(theUser);
    

    正确版本:

    await sequelizeConnection.sequelize.transaction(async(transaction) => {
            const createdUser = await sequelizeConnection.models.user.create(req.body, {transaction});
    
            const userSettings = {
                wants_update_notification: false,
                color_scheme: 0,
                user_id: createdUser.user_id, // Associate user with user_settings
            };
            await sequelizeConnection.models.user_settings.create(userSettings, {transaction});
    });
    

    我建议您使用sequelize.transaction 在数据创建失败的情况下进行回滚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-30
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      相关资源
      最近更新 更多