首页 > 解决方案 > 如何使用 knexjs 在 psql 中的多行中插入数组

问题描述

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

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

我正在尝试以下代码来执行此操作。(同样,“详细”数组的大小随主题数量而变化)

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

标签: javascriptpostgresqlpsqlknex.js

解决方案


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

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

当您将东西添加到第二个表时,它应该是这样的:

.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);
})

推荐阅读