Массивная вставка из файла JSON с помощью Pg-Promise - PullRequest
0 голосов
/ 07 мая 2018

Загрузка огромного файла JSON с помощью помощников Pg-Promise и потока fs.

Я использую pg-обещание и хочу сделать массивные вставки в таблицу, используя pgp.helpers. Я видел такое решение, как многострочная вставка с pg-обещанием, а также следовал импорт данных для потоков (Spex), но все равно он не с той же ошибкой, как в этом посте https://github.com/vitaly-t/spex/issues/8

Я попытался использовать пример из другого поста в потоке CSV (rs.csv ()), но когда я заменил то же самое с анализатором JSonStream, я все еще получаю ту же ошибку.

Можете ли вы поделиться рабочим примером?

db.tx(t => { return streamRead.call(t, stream.pipe(parser), receiver) })

1 Ответ

0 голосов
/ 08 мая 2018

Возможно, есть лучший способ сделать это, но приведенный ниже код, безусловно, работает! У меня есть чанки (row.length) по 20 000 на оператор вставки, которые вы можете корректировать в соответствии с вашими потребностями.

stream.pipe(parser)
  parser.on('data', data =>{
    row.push(data)
    if (row.length === 20000) { 
      parser.pause()
      //console.log(row.length)
      db.tx('inserting-products', t => {
        const insert = pgp.helpers.insert(row, cs)
        t.none(insert).then(() => {
          row =[]
          parser.resume()
        })
      })
    }
  })

  parser.on('end', () =>{
    //console.log(row.length)
    if(row.length != 0){
      db.tx('inserting-products', t => {
        const insert = pgp.helpers.insert(row, cs)
        t.none(insert).then(() => {
          console.log('success')
          db.$pool.end()
        })
      })
    }
    if(row.length === 0) {
      console.log('success')
      db.$pool.end()
    }
  })

Пожалуйста, дайте мне знать в комментариях, если это поможет или каким-либо другим способом улучшить процесс.

...