使用objection.js将数组数据批量插入到mysql数据库中

时间:2016-06-13 10:00:45

标签: mysql node.js knex.js objection.js

我有一个数组

newData = [{ sId: 'XXXXXX', itemlName: 'LSストレッ', iCode: 'XXXXXX', iType: '', skus: 'XXXXXXX', iLevel: 'L2', cCode: '88', cName: 'Other', sCode: '999', sName: 'No Control', pLengthCode: '988', core: 'N', sCode: '1', dCode: 'XX', gDeptCode: 'XX', gDeptName: 'Women\\\'s Items', rCode: 'jqs' },{ sId: 'XXXXXX', itemlName: 'LSストレッ', iCode: 'XXXXXX', iType: '', skus: 'XXXXXXX', iLevel: 'L2', cCode: '88', cName: 'Other', sCode: '999', sName: 'No Control', pLengthCode: '988', core: 'N', sCode: '1', dCode: 'XX', gDeptCode: 'XX', gDeptName: 'Women\\\'s Items', rCode: 'jqs' }]

我想使用objection.js将newData插入到mysql数据库中。但是当我运行我的节点应用程序时,我收到错误说:

  

错误:批量插入仅适用于Postgresql

我的插入代码是 - :

samplemodel.query().insert( newData );

如何使用objection.js?

在mysql数据库中执行数组数据的批量插入

5 个答案:

答案 0 :(得分:1)

错误:批量插入仅适用于Postgresql

嗯,这意味着你需要Postgres而不是Mysql来使它工作。

Edit1:

来自文档:

  

如果您使用的是Postgres,则可以批量完成插入操作   性能。在其他数据库上,需要在a处插入一行   时间。这是因为postgresql是唯一的数据库引擎   返回所有插入行的标识符,而不仅仅是第一个或   最后一个。

这意味着如果你使用的是mysql,你应该这样做

samplemodel.query().insert(data);

对于" newData"中的每个元素;阵列。

答案 1 :(得分:1)

你可以打电话

samplemodel.query().insertWithRelated( newData );

如果需要,它使用多个查询并适用于所有数据库。

答案 2 :(得分:1)

在最新版本的反对意见insertWithRelated 已弃用!

相反,您需要使用 insertGraph

samplemodel.query().insertGraph(newData);

samplemodel.query().insertGraph(newData, { allowRefs: true });

答案 3 :(得分:0)

技巧是使insert语句转换为字符串并执行原始sql。

类似

let insertQuery = samplemodel.query().insert( newData ); let insertRes = await knex.raw(insertQuery.toString())

PS:如果这不是一种好的做法,我将感谢您通知我!

答案 4 :(得分:0)

由于mysql的限制,因此无法减少查询数量。

我要遍历它,将其插入到promises数组中,然后执行它抛出Promise.all

...
let insertPromises = []
for(let item of newData){
    insertPromises.push(samplemode.query().insert(item))
}

Promise.all(insertPromises).then(() => { ... })
...

如果我将这种方法与$query$relatedQuery结合使用以确保数据整数化,我建议使用事务处理