如何使用 knexjs 在 psql 中的多行中插入数组

How do I can insert array in multiple rows in psql using knexjs

我正在使用事务 outta knexjs 在 2 table 秒内插入值(1.结果,2.结果详细信息)。在 table 2 (resultdetail) 中插入值时,我有一个对象数组,其大小随每个条目而变化(基于主题数)。

{
 "name": "Sally",
 "fathername": "John",
 "rollno": "85a76",
 "classname": "class1",
 "detail": [
  {
   "subject": "History",
   "marksobt": "50",
   "totalmarks": "100"
  },
  {
   "subject": "French",
   "marksobt": "75",
   "totalmarks": "75"
  }
 ]
}

我正在尝试按照代码来执行此操作。 (同样,"detail" 数组的大小随主题的数量而变化)

const { name, fathername, rollno, classname } = req.body;
 db.transaction(trx => {
  db.insert({
   name: name,
   fathername: fathername,
   rollno: rollno,
   classname: classname
  }).into('results')
  .transacting(trx)
  .returning('rollno')
  .then(roll_no => {
   req.body.detail.map(result => {
    return trx('resultdetail')
    .returning('*')
    .insert({
     rollno: roll_no[0],
     subject: result.subject,
     marksobt: result.marksobt,
     totalmarks: result.totalmarks
    }).then(console.log)
   })
  })
  .then(trx.commit)
  .catch(trx.rollback)
 })
 .catch(err => res.status(400).json(err))
但最终出现以下错误。

Unhandled rejection Error: Transaction query already complete, run with DEBUG=knex:tx for more info

insertedRows = await knex('results').returning('*').insert([
    {
        "subject": "History",
        "marksobt": "50",
        "totalmarks": "100"
    },
    {
        "subject": "French",
        "marksobt": "75",
        "totalmarks": "75"
    }
]);

但主要是您的问题是您同时启动多个查询 + 提交,而没有等待较早的查询准备就绪...

当你向第二个 table 添加东西时,它应该是这样的:

.then(roll_no => {
  let resultsToAdd = req.body.detail.map(result => {
     return {
       rollno: roll_no[0],
       subject: result.subject,
       marksobt: result.marksobt,
       totalmarks: result.totalmarks
     };
   });

   return return trx('resultdetail')
     .returning('*')
     .insert(resultsToAdd);
})