使用brianc/node-postgres批量插入Postgres

lon*_*ymo 5 postgresql node.js node-postgres

我在nodejs中使用以下代码使用pg(https://github.com/brianc/node-postgres)我的代码为员工创建订阅就是这样.

    client.query(
      'INSERT INTO subscriptions (subscription_guid, employer_guid, employee_guid) 
       values ($1,$2,$3)', [
        datasetArr[0].subscription_guid,
        datasetArr[0].employer_guid,
        datasetArr[0].employee_guid
      ],


      function(err, result) {
        done();

        if (err) {
          set_response(500, err, res);
          logger.error('error running query', err);
          return console.error('error running query', err);
        }

        logger.info('subscription with created');
        set_response(201);

      });
Run Code Online (Sandbox Code Playgroud)

您已经注意到datasetArr是一个数组.我想一次为多个员工创建大量订阅.但是我不想循环遍历数组.有没有办法用pg开箱即用?

Ser*_*tov 9

在我看来,最好的方法是使用 PostgreSQL json 函数:

client.query('INSERT INTO table (columns) ' +
        'SELECT m.* FROM json_populate_recordset(null::your_custom_type, $1) AS m',
        [JSON.stringify(your_json_object_array)], function(err, result) {
      if(err) {
            console.log(err);
      } else {
            console.log(result);
      }
});
Run Code Online (Sandbox Code Playgroud)


The*_*ive 5

我搜索了同样的问题,但还没有找到解决方案.使用异步库,可以多次使用查询,并进行必要的错误处理.

可能是这个代码变体有帮助.(用于将10.000个小json对象插入空数据库,花费6秒).

克里斯托夫

function insertData(item,callback) {
  client.query('INSERT INTO subscriptions (subscription_guid, employer_guid, employee_guid)
       values ($1,$2,$3)', [
        item.subscription_guid,
        item.employer_guid,
        item.employee_guid
       ], 
  function(err,result) {
    // return any err to async.each iterator
    callback(err);
  })
}
async.each(datasetArr,insertData,function(err) {
  // Release the client to the pg module
  done();
  if (err) {
    set_response(500, err, res);
    logger.error('error running query', err);
    return console.error('error running query', err);
  }
  logger.info('subscription with created');
  set_response(201);
})
Run Code Online (Sandbox Code Playgroud)