【问题标题】:Batch insert of array data into mysql database using objection.js使用 objection.js 将数组数据批量插入 mysql 数据库
【发布时间】:2016-10-13 16:47:11
【问题描述】:

我有一个数组

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数据库中批量插入数组数据?

【问题讨论】:

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


    【解决方案1】:

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

    您需要使用insertGraph

    samplemodel.query().insertGraph(newData);
    

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

    【讨论】:

      【解决方案2】:

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

      我会遍历它,将它插入到 promise 数组中并执行它 throw Promise.all

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

      如果我将这种方法与$query$relatedQuery 一起使用以确保数据完整性,我建议使用事务

      【讨论】:

      • 你能举一个与promise.all交易的例子吗?
      【解决方案3】:

      诀窍是将插入语句转换为字符串并执行原始sql。

      类似

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

      PS:如果这不是一个好的做法,我会很感激你告诉我!

      【讨论】:

        【解决方案4】:

        你可以打电话

        samplemodel.query().insertWithRelated( newData );

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

        【讨论】:

          【解决方案5】:

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

          嗯,这意味着您需要 Postgres 而不是 Mysql 才能使其工作。

          编辑1:

          来自文档:

          如果您使用 Postgres,则插入是分批完成的 表现。在其他数据库中,行需要插入一个 时间。这是因为 postgresql 是唯一的数据库引擎 返回所有插入行的标识符,而不仅仅是第一行或 最后一个。

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

          samplemodel.query().insert(data);
          

          对于“newData”数组中的每个元素。

          【讨论】:

          • 抱歉,这不是问题的答案。
          • 为什么不呢?这似乎对 OP 有所帮助
          • 因为你的答案并没有解决问题,即:使用 MySQL 批量插入。 OP将Mysql指定为标签。
          • 文档声明不能使用 MySQL 批量插入,因此唯一的解决方案是一个一个插入。
          猜你喜欢
          • 1970-01-01
          • 2014-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-05
          • 2012-04-20
          相关资源
          最近更新 更多