Sequelize Insert事务(两表多行)
Sequelize Insert transaction (two tables, multiple rows)
两个 table:post 和 post_resources。
我要实现的逻辑:
每当我向 post table 添加数据时,我也想向 post_resources table 添加资源,使用相同的外键 PostId
我是怎么做到的:
const post = {
name: req.body.title,
description: req.body.description,
}
try {
const result = await sq.transaction(async (t) => {
await Post.create(post, { transaction: t })
.then(async data => {
await PostResources.create({
PostId: data.id,
name: req.body.title,
url: req.body.url,
}, { transaction: t })
})
});
res.status(200).json(result)
} catch (error) {
console.log(error || 'Error occured in transaction');
}
Ps:url 是要插入到 post_ressources 中的 url 的数组以及相同的 PostId !重要
请随时询问更多详情,谢谢
您同时使用了await
和then
,这是一个错误,因为它们很相似。
您的错误表明您已经提交了交易,因此解决方案如下:
const post = {
name: req.body.title,
description: req.body.description,
}
const t = await sequelize.transaction();
try {
const resultPost = await Post.create(post, { transaction: t })
const resultPostResources = await PostResources.create({
PostId: resultPost.id,
name: req.body.title,
url: req.body.url,
}, {transaction: t})
await t.commit();
res.status(200).json(result)
}catch (error) {
console.log(error || 'Error occured in transaction');
}
现在您仅在创建查询后才提交事务,并且您还从第一个查询中获取值以在第二个查询中使用。
注意create
returns 创建的对象,所以你可以利用它
两个 table:post 和 post_resources。 我要实现的逻辑: 每当我向 post table 添加数据时,我也想向 post_resources table 添加资源,使用相同的外键 PostId
我是怎么做到的:
const post = {
name: req.body.title,
description: req.body.description,
}
try {
const result = await sq.transaction(async (t) => {
await Post.create(post, { transaction: t })
.then(async data => {
await PostResources.create({
PostId: data.id,
name: req.body.title,
url: req.body.url,
}, { transaction: t })
})
});
res.status(200).json(result)
} catch (error) {
console.log(error || 'Error occured in transaction');
}
Ps:url 是要插入到 post_ressources 中的 url 的数组以及相同的 PostId !重要
请随时询问更多详情,谢谢
您同时使用了await
和then
,这是一个错误,因为它们很相似。
您的错误表明您已经提交了交易,因此解决方案如下:
const post = {
name: req.body.title,
description: req.body.description,
}
const t = await sequelize.transaction();
try {
const resultPost = await Post.create(post, { transaction: t })
const resultPostResources = await PostResources.create({
PostId: resultPost.id,
name: req.body.title,
url: req.body.url,
}, {transaction: t})
await t.commit();
res.status(200).json(result)
}catch (error) {
console.log(error || 'Error occured in transaction');
}
现在您仅在创建查询后才提交事务,并且您还从第一个查询中获取值以在第二个查询中使用。
注意create
returns 创建的对象,所以你可以利用它