nodeJS将数据插入PostgreSQL错误

女士们,先生们,

我有一个奇怪的错误使用PostgreSQL的NodeJS,我希望你也许可以帮助我。

我有大量的数据集,大约200万个条目,我想插入到我的数据库。

一个数据由4列组成:

id: string, points: float[][] mid: float[] occurences: json[] 

我插入像这样的数据:

 let pgp = require('pg-promise')(options); let connectionString = 'postgres://archiv:archiv@localhost:5432/fotoarchivDB'; let db = pgp(connectionString); cityNet.forEach((arr) => { db .none( "INSERT INTO currentcitynet(id,points,mid,occurences) VALUES $1", Inserts("${id},${points}::double precision[],${mid}::double precision[],${occurences}::json[]",arr)) .then(data => { //success }) .catch(error => { console.log(error); //error }); }) function Inserts(template, data) { if (!(this instanceof Inserts)) { return new Inserts(template, data); } this._rawDBType = true; this.formatDBType = function() { return data.map(d => "(" + pgp.as.format(template, d) + ")").join(","); }; 

这对于第一个309248数据块来说确切地说是正确的,然后突然出现下面的错误信息(看上去像是这样),它试图插入下一个数据:

 { error: syntax error at end of input at Connection.parseE (/home/christian/Masterarbeit_reworked/projekt/server/node_modules/pg-promise/node_modules/pg/lib/connection.js:539:11) at Connection.parseMessage (/home/christian/Masterarbeit_reworked/projekt/server/node_modules/pg-promise/node_modules/pg/lib/connection.js:366:17) at Socket.<anonymous> (/home/christian/Masterarbeit_reworked/projekt/server/node_modules/pg-promise/node_modules/pg/lib/connection.js:105:22) at emitOne (events.js:96:13) at Socket.emit (events.js:188:7) at readableAddChunk (_stream_readable.js:176:18) at Socket.Readable.push (_stream_readable.js:134:10) at TCP.onread (net.js:548:20) name: 'error', length: 88, severity: 'ERROR', code: '42601', detail: undefined, hint: undefined, position: '326824', internalPosition: undefined, internalQuery: undefined, where: undefined, schema: undefined, table: undefined, column: undefined, dataType: undefined, constraint: undefined, file: 'scan.l', line: '1074', routine: 'scanner_yyerror' } 

每个迭代错误消息的“位置”条目都会改变。

我可以重做,它会在309248条目后总是出错。 当我尝试插入较less,如1000条目,错误不会发生。

这真让我困惑。 我认为PostgreSQL没有任何最大的行数。 此外,错误信息并没有帮助我。

任何意见将是有益的。

已解决find了错误。 在我的数据中有“空”的条目已经滑入它。 过滤掉空数据。 我会尝试插入数据的其他build议,因为目前的方式工作,但performance是非常糟糕的。

我不确定,但是看起来你在最后一个元素(309249)有错误的数据结构,PostgreSQL不能parsing某些属性

我是pg-promise的作者。 你的整个方法应改为下面的方法。

正确的方法来通过pg-promise做大量插入:

 const pgp = require('pg-promise')({ capSQL: true }); const db = pgp(/*connection details*/); var cs = new pgp.helpers.ColumnSet([ 'id', {name: 'points', cast: 'double precision[]'}, {name: 'mid', cast: 'double precision[]'}, {name: 'occurences', cast: 'json[]'} ], {table: 'currentcitynet'}); function getNextInsertBatch(index) { // retrieves the next data batch, according to the index, and returns it // as an array of objects. A normal batch size: 1000 - 10,000 objects, // depending on the size of the objects. // // returns null when there is no more data left. } db.tx('massive-insert', t => { return t.sequence(index => { const data = getNextInsertBatch(index); if (data) { const inserts = pgp.helpers.insert(data, cs); return t.none(inserts); } }); }) .then(data => { console.log('Total batches:', data.total, ', Duration:', data.duration); }) .catch(error => { console.log(error); }); 

UPDATE

如果getNextInsertBatch只能asynchronous获取数据,则返回一个promise,并相应地更新sequence->sourcecallback:

 return t.sequence(index => { return getNextInsertBatch(index) .then(data => { if (data) { const inserts = pgp.helpers.insert(data, cs); return t.none(inserts); } }); }); 

相关链接:

  • TX
  • 序列 / spex.sequence
  • ColumnSet
  • 带pg-promise的多行插入