在 sequelize 中,我们如何获取父 ID 以更新同一事务中的子记录。我正在尝试这种方式,但它只是无法获取父级的 ID。
db.sequelize.transaction(function (t) {
return db.Employee.create(employeeData, {transaction:t}).then(function(newEmployee)
{
//how to get the parent ID here?
var empDetailData = {x: "", y: "", emp_id:newEmployee.id};
return db.EmployeeDetails.create(empDetailData, {transaction:t}).then(function(newDetail)
{
res.json(newEmployee);
});
});
});
数据库关系
Employee.hasMany(EmployeeDetails, {foreignKey:'emp_id'});
它错误地说 emp_id 不能为空。任何指向正确方向的指针将不胜感激。我怎样才能获得 id 以便交易可以工作。
已解决 :实际问题是数据库代码丢失 autoIncrement: true
id: {
type: Sequelize.INTEGER,
primaryKey: true,
**autoIncrement: true** was missing.
},
最佳答案
您缺少的是 t.commit()
和 t.rollback()
。您需要在 newEmployee
的 promise 链中使用 newDetails
,它在 promise 回调链中引入 callback hell 。 Async/Await
和 t.commit()
之后给出了一个使用 t.rollback()
的简洁版本。
async function createUser(employeeData) {
let transaction;
try {
transaction = await db.sequelize.transaction();
const newEmployee = await db.Employee.create( employeeData, {
transaction: transaction
})
const empDetailData = {
x: "",
y: "",
emp_id:newEmployee.id
};
await db.EmployeeDetails.create(empDetailData, {
transaction: transaction
})
await transaction.commit()
res.json(newEmployee)
} catch(error) {
if(transaction) {
await transaction.rollback()
}
// HANDLE THE ERROR AS YOU MANAGE IN YOUR PROJECT
}
}
关于node.js - 使用相同的事务在 sequelize 中插入父/子记录的正确方法(获取父 ID),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59118323/