javascript - 使用 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)
我有一个需要立即插入表中的数据对象。关于如何解决这个问题的任何想法?
解决方案
所以,我建议你首先学习 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 可能有一种“更好”的方法来做到这一点,但文档真的很差,所以这可以完成工作。
推荐阅读
- php - 使用 MySQL 按日期和时间分别选择条目
- opengl - GLFW-RS 只显示黑色方块而不是旋转立方体
- kubernetes - 虽然外部 ip 已解析,但网站在 kubernetes GKE 中返回连接超时
- php - 使用用户名登录时如何获取用户其他数据?
- c++ - 如何使父类不重复已经执行的祖父方法
- python - 未安装 Windows 软件开发工具包时,UI 自动化失败并出现 pywinauto ElementNotFoundError
- javascript - 如何在 Javascript 工作线程中“正确”屈服以进行消息处理?
- oracle - SQL Loader:双引号内的双引号
- python - 尝试使用循环设置变量时,为什么会出现类型错误?
- python - 如何在 tensorflow 2.1.0 中将 mnist 数据集转换为 tfrecords