Knex事务查询和Postgres外键约束
Knex transaction query and Postgres foreign key constraint
我正在使用 knex.transaction 在约会 table 中创建一条记录,并在 user_appointments table 中创建多个记录,其中 appointment_id 在后者 table 引用前者中的相同字段(外键约束)。
db.transaction(trx => {
return (appointment_id ?
trx('appointments')
.update({type: appointment_type, time_from: time_from, time_to: time_to, title: title, note: note})
.where('appointment_id', '=', appointment_id)
.returning('appointment_id')
:
trx
.insert({type: appointment_type, time_from: time_from, time_to: time_to, title: title, note: note})
.into('appointments')
.returning('appointment_id'))
.then(apptId => {
return Promise.all(user_ids.map((userid) => {
console.log('inserting row user id:', userid);
return db.insert({appointment_id: apptId[0], user_id: userid})
.into('user_appointment');
}));
})
})
.then(() => {
res.json('success');
})
.catch(err => {
res.status(400).json('failed');
});
我 运行 出错了,因为创建约会记录的第一个查询没有在引用约会 ID 的后续查询之前执行:Key (appointment_id)=(6) table "appointments".
中不存在
我尝试在单个事务中执行这些查询是否不正确(即,如果有外键约束,则单独执行)?
我发现了问题。我在 'user_appointment' table 的插入中引用了 'db',我不得不引用 'trx':
return trx.insert({appointment_id: apptId[0], user_id: userid})
.into('user_appointment');
我正在使用 knex.transaction 在约会 table 中创建一条记录,并在 user_appointments table 中创建多个记录,其中 appointment_id 在后者 table 引用前者中的相同字段(外键约束)。
db.transaction(trx => {
return (appointment_id ?
trx('appointments')
.update({type: appointment_type, time_from: time_from, time_to: time_to, title: title, note: note})
.where('appointment_id', '=', appointment_id)
.returning('appointment_id')
:
trx
.insert({type: appointment_type, time_from: time_from, time_to: time_to, title: title, note: note})
.into('appointments')
.returning('appointment_id'))
.then(apptId => {
return Promise.all(user_ids.map((userid) => {
console.log('inserting row user id:', userid);
return db.insert({appointment_id: apptId[0], user_id: userid})
.into('user_appointment');
}));
})
})
.then(() => {
res.json('success');
})
.catch(err => {
res.status(400).json('failed');
});
我 运行 出错了,因为创建约会记录的第一个查询没有在引用约会 ID 的后续查询之前执行:Key (appointment_id)=(6) table "appointments".
中不存在我尝试在单个事务中执行这些查询是否不正确(即,如果有外键约束,则单独执行)?
我发现了问题。我在 'user_appointment' table 的插入中引用了 'db',我不得不引用 'trx':
return trx.insert({appointment_id: apptId[0], user_id: userid})
.into('user_appointment');