nodeJS insertando datos en PostgreSQL error

Tengo un error extraño al usar NodeJS con un PostgreSQL y espero que me puedas ayudar.

Tengo una gran cantidad de conjuntos de datos, aproximadamente 2 millones de entradas que quiero insertar en mi base de datos.

Un dato consta de 4 columnas:

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

Estoy insertando datos como tal:

 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(","); }; 

Esto funciona exactamente para las primeras 309248 piezas de datos, luego, de repente, simplemente se produce un error con lo siguiente para (lo que parece) cada próxima información que intenta insertar:

 { 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. (/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' } 

La entrada de ‘posición’ cambia para cada mensaje de error iterativo.

Puedo rehacer eso y siempre aparecerá un error después de 309248 entradas. Cuando bash insertar menos, como 1000 entradas, no se produce el error.

Eso realmente me confunde. Pensé que PostgreSQL no tiene una cantidad máxima de filas. También el mensaje de error no me ayuda en absoluto.

SOLUCIONADO Se encontró el error. En mis datos había entradas “nulas” que se habían deslizado en él. Filtrado de datos nulos funcionó. Voy a probar las otras recomendaciones para insertar datos, ya que la forma actual funciona, pero el rendimiento es muy malo.

No estoy seguro, pero parece que tienes una estructura de datos incorrecta en el último elemento (309249) y PostgreSQL no puede analizar alguna propiedad

Soy el autor de pg-promise . Todo su enfoque debe ser cambiado al de abajo.

Manera adecuada de hacer inserciones masivas a través de 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); }); 

ACTUALIZAR

Y si getNextInsertBatch solo puede obtener los datos de forma asíncrona, devuelva una promesa y actualice la sequence->source callback en consecuencia:

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

Enlaces relacionados:

  • tx
  • secuencia / spex.sequence
  • ColumnSet
  • Inserción de varias filas con pg-promise