首页 > 解决方案 > 使用 Sequelize 在多个表中插入数据

问题描述

这是我第一次将 Sequelize 与 MySQL 一起使用,并且想了解如何将数据插入到具有外键依赖关系的两个表中。比方说,我有两个表 - bookingDescription 和 bookingSummary。相同的实体如下

//bookingSummary
module.exports = (sequelize, DataTypes) => {
    return sequelize.define('bookingSummary', {
        headerId: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true,},
        titleId: DataTypes.STRING,
        abNumber: DataTypes.INTEGER,
        userProfileId: DataTypes.INTEGER,
        theatreId: DataTypes.STRING,
        mFId: DataTypes.STRING,
        createdBy: { type: DataTypes.TEXT, allowNull: false },
        modifiedBy: { type: DataTypes.TEXT, allowNull: false },
        status: DataTypes.STRING
    }, {
        tableName: 'booking_summary',
        underscored: true
    })
}

//bookingDescription 
module.exports = (sequelize, DataTypes) => {
    return sequelize.define('bookingWeek', {
        lineId: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true,},
        headerId: DataTypes.STRING,
        titleId: DataTypes.STRING,
        abNumber: DataTypes.INTEGER,
        theatreId: DataTypes.STRING,
        mFId: DataTypes.STRING,
        theatreName: DataTypes.STRING,
        city: DataTypes.STRING,
        state: DataTypes.STRING,
        playStartDate: DataTypes.DATE,
        playEndDate: DataTypes.DATE,
        preferredFormat: DataTypes.INTEGER,
        screensInDay: DataTypes.INTEGER,
        featureTypeFlag: DataTypes.TEXT,
        cofeatureName: DataTypes.STRING,
        exhbtrReqComment: DataTypes.STRING,
        createdBy: { type: DataTypes.TEXT, allowNull: false },
        modifiedBy: { type: DataTypes.TEXT, allowNull: false },
        status: DataTypes.STRING
    }, {
        tableName: 'booking_description',
        underscored: true
    })
}

booking中的外键引用总结如下

FOREIGN KEY (headerId) REFERENCES bookingSummary(headerId)

外键(titleId、abNumber、mFId)

参考bookingSummary(abNumber)

我有一个需要立即插入表中的数据对象。关于如何解决这个问题的任何想法?

标签: javascriptmysqlnode.jslambdasequelize.js

解决方案


所以,我建议你首先学习 SQL 关系,不管 Sequelize 和你当前的项目结构,因为在我看来,你仍然缺乏对这些关联背后的逻辑的基本了解,它们应该在哪里使用以及如何使用。

你的两个表都有重复的字段,这是没有意义的。看这里,例如:https ://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

至于您当前的代码,我玩了一下,这就是我所做的(仅当您使用 model.sync() 时才有效,因为需要自动创建一列。如果您也使用 force:true已经有表格):

module.exports = (sequelize, DataTypes) => {
    const bookingHeader =  sequelize.define('bookingHeader', {
        id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true},        
        abNumber: DataTypes.INTEGER,
        userProfileId: DataTypes.INTEGER,
        theatreId: DataTypes.STRING,
        mFId: DataTypes.STRING,
        createdBy: { type: DataTypes.TEXT, allowNull: true },
        modifiedBy: { type: DataTypes.TEXT, allowNull: true },
        status: DataTypes.STRING
    }, {
        tableName: 'booking_header',
        // underscored: true
    })

    bookingHeader.associate = function (models) {


        bookingHeader.hasOne(models.bookingDescription);
    };

    return bookingHeader;
}

预订说明:

module.exports = (sequelize, DataTypes) => {
    const bookingDescription = sequelize.define('bookingDescription', {
        id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, },
        abNumber: DataTypes.INTEGER,
        theatreId: DataTypes.STRING,
        mFId: DataTypes.STRING,
        theatreName: DataTypes.STRING,
        city: DataTypes.STRING,
        state: DataTypes.STRING,
        playStartDate: DataTypes.DATE,
        playEndDate: DataTypes.DATE,
        preferredFormat: DataTypes.INTEGER,
        screensInDay: DataTypes.INTEGER,
        featureTypeFlag: DataTypes.TEXT,
        cofeatureName: DataTypes.STRING,
        exhbtrReqComment: DataTypes.STRING,
        createdBy: { type: DataTypes.TEXT, allowNull: false },
        modifiedBy: { type: DataTypes.TEXT, allowNull: false },
        status: DataTypes.STRING
    }, {
        tableName: 'booking_description',
        // underscored: true
    })

    bookingDescription.associate = function (models) {


        bookingDescription.belongsTo(models.bookingHeader);
    };

    return bookingDescription;
}

在您的路线中,您可以执行以下操作:

  const {bookingHeader,bookingDescription} = models;

  app.post("/booking", async (req, res, next) => {
    try {     
      const header = await bookingHeader.create(req.body)
      const headerId = header.id      
      await bookingDescription.create({state:'active',createdBy:'somebody',modifiedBy:'somebody',bookingHeaderId:headerId})      
      res.json(header);
    } catch (error) {
      console.log(error)
      res.status(500)    
    }
  });

请注意,我对描述的一些字段进行了硬编码,仅用于示例目的。此外,Sequelize 可能有一种“更好”的方法来做到这一点,但文档真的很差,所以这可以完成工作。


推荐阅读