使用 objection.js 将数组数据批量插入 mysql 数据库
Batch insert of array data into mysql database using 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 数据库中。但是当我 运行 我的节点应用程序时,我收到错误消息:
Error: batch insert only works with Postgresql
我的插入代码是-:
samplemodel.query().insert( newData );
如何使用objection.js在mysql数据库中批量插入数组数据?
错误:批量插入仅适用于 Postgresql
嗯,这意味着您需要 Postgres 而不是 Mysql 才能使其正常工作。
编辑 1:
来自文档:
If you are using Postgres the inserts are done in batches for maximum
performance. On other databases the rows need to be inserted one at a
time. This is because postgresql is the only database engine that
returns the identifiers of all inserted rows and not just the first or
the last one.
这意味着如果您正在使用 mysql,您应该
samplemodel.query().insert(data);
对于 "newData" 数组中的每个元素。
您可以拨打
samplemodel.query().insertWithRelated( newData );
它在需要时使用多个查询并适用于所有数据库。
诀窍是将插入语句转换为字符串并执行原始 sql。
类似
let insertQuery = samplemodel.query().insert( newData );
let insertRes = await knex.raw(insertQuery.toString())
PS:如果这不是很好的做法,请告诉我,我将不胜感激!
因此,由于 mysql 限制,无法减少查询数量。
我会遍历它,将它插入到 promise 数组中并执行它抛出 Promise.all
...
let insertPromises = []
for(let item of newData){
insertPromises.push(samplemode.query().insert(item))
}
Promise.all(insertPromises).then(() => { ... })
...
如果我将此方法与 $query
或 $relatedQuery
一起使用,我建议使用事务来确保数据完整性
在最新版本的 Objection 中 insertWithRelated
已弃用!
您需要使用 insertGraph
samplemodel.query().insertGraph(newData);
或
samplemodel.query().insertGraph(newData, { allowRefs: true });
我有一个数组
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 数据库中。但是当我 运行 我的节点应用程序时,我收到错误消息:
Error: batch insert only works with Postgresql
我的插入代码是-:
samplemodel.query().insert( newData );
如何使用objection.js在mysql数据库中批量插入数组数据?
错误:批量插入仅适用于 Postgresql
嗯,这意味着您需要 Postgres 而不是 Mysql 才能使其正常工作。
编辑 1:
来自文档:
If you are using Postgres the inserts are done in batches for maximum performance. On other databases the rows need to be inserted one at a time. This is because postgresql is the only database engine that returns the identifiers of all inserted rows and not just the first or the last one.
这意味着如果您正在使用 mysql,您应该
samplemodel.query().insert(data);
对于 "newData" 数组中的每个元素。
您可以拨打
samplemodel.query().insertWithRelated( newData );
它在需要时使用多个查询并适用于所有数据库。
诀窍是将插入语句转换为字符串并执行原始 sql。
类似
let insertQuery = samplemodel.query().insert( newData );
let insertRes = await knex.raw(insertQuery.toString())
PS:如果这不是很好的做法,请告诉我,我将不胜感激!
因此,由于 mysql 限制,无法减少查询数量。
我会遍历它,将它插入到 promise 数组中并执行它抛出 Promise.all
...
let insertPromises = []
for(let item of newData){
insertPromises.push(samplemode.query().insert(item))
}
Promise.all(insertPromises).then(() => { ... })
...
如果我将此方法与 $query
或 $relatedQuery
一起使用,我建议使用事务来确保数据完整性
在最新版本的 Objection 中 insertWithRelated
已弃用!
您需要使用 insertGraph
samplemodel.query().insertGraph(newData);
或
samplemodel.query().insertGraph(newData, { allowRefs: true });