У меня есть транзакция, которая выполняет вставку в моей базе данных, но мне нужно выполнить другую более простую вставку, и я хотел бы вызвать откат транзакции, если во второй вставке есть ошибка.
await knex.transaction(async trx => {
const queries = []
for(const dadoResultado of dadoResultados.dados){
const query = app.db.raw(`
insert into dadoResultados
...
`)
.transacting(trx)
.catch(err => res.status(500).send(err.message))
queries.push(query)
}
await Promise.all(queries)
.then(trx.commit)
.catch(trx.rollback)
})
await app.db.raw(`
INSERT INTO resumoacompanhamentos (num, value)
values (13, 50)
`)
Изменение кода:
try{
await app.db(async trx => {
for(const data of values.dados){
await trx.raw(`
insert into values(code_inst, money, subscription, version, first_name)
select
b.code_inst,
b.money
p.subscription,
a.version,
b.first_name
from (VALUES (${data.code_inst}, ${data.money}, ${data.first_name}) b(code_inst, money, first_name)
inner join table_P as p
on p.code_inst = b.code_inst
AND p.version = b.version
AND p.code_inst = b.code_inst
left join table_A AS a
on a.subscription = p.subscription
`)
}
const sum_value_final = await app.db.raw(`
SELECT
SUM(money) AS money
FROM values
WHERE first_name = ${first_nameFile}
AND subscription = ${values.dados[0].subscription}
`)
const sumValues = await sum_value_final.rows[0]
await app.db.raw(`
INSERT INTO resume_table (code_inst, subscription)
values (${sumValues.dados[0].code_inst}, ${sumValues.dados[0].subscription)
`)
})
} catch(err){
res.status(500).send(err.message);
}
ОШИБКА ВТОРАЯ:
select * from (select *) - подзапрос в FROM должен иметь псевдоним