Copia de múltiples columnas en formato postgresql Node.js

Utilizando la secuencia de postgres para insertar el registro en postgres, para una sola columna funciona bien, pero ¿cuál es el formato de datos ideal para copiar para varias columnas?

fragmentos de código

var sqlcopysyntax = 'COPY srt (starttime, endtime) FROM STDIN delimiters E\'\\t\''; var stream = client.query(copyFrom(sqlcopysyntax)); console.log(sqlcopysyntax) var interndataset = [ ['1', '4'], ['6', '12.074'], ['13.138', '16.183'], ['17.226', '21.605'], ['22.606', '24.733'], ['24.816', '27.027'], ['31.657', '33.617'], ['34.66', '37.204'], ['37.287', '38.58'], ['39.456', '43.669'], ['43.752', '47.297'], ['47.381', '49.55'], ]; var started = false; var internmap = through2.obj(function(arr, enc, cb) { /* updated this part by solution provided by @VaoTsun */ var rowText = arr.map(function(item) { return (item.join('\t') + '\n') }).join('') started = true; //console.log(rowText) rowText=rowText+'\\\.'; /* end here*/ started = true; cb(null, rowText); }) internmap.write(interndataset); internmap.end(); internmap.pipe(stream); 

en el que obtuve el error: (debido al delimitador) faltan datos para la columna “tiempo de finalización” (resuelto) pero obtuve un error inferior

 error: end-of-copy marker corrupt 

introduzca la descripción de la imagen aquí

 COPY intern (starttime, endtime) FROM STDIN 1 4 6 12.074 13.138 16.183 17.226 21.605 22.606 24.733 24.816 27.027 31.657 33.617 34.66 37.204 37.287 38.58 39.456 43.669 43.752 47.297 47.381 49.55 

cualquier puntero sobre cómo resolver esto. ¿Cuál sería el formato ideal para inserciones de múltiples columnas utilizando el comando de copia?

Con inmensa ayuda de @jeromew de la comunidad github.

y la implementación adecuada de node-pg-copy-streams (elimina la complejidad del comando de copia). pudimos resolver este problema

https://github.com/brianc/node-pg-copy-streams/issues/65 a continuación son fragmentos de código de trabajo

 var sqlcopysyntax = 'COPY srt (starttime, endtime) FROM STDIN ; var stream = client.query(copyFrom(sqlcopysyntax)); console.log(sqlcopysyntax) var interndataset = [ ['1', '4'], ['6', '12.074'], ['13.138', '16.183'], ['17.226', '21.605'], ['22.606', '24.733'], ['24.816', '27.027'], ['31.657', '33.617'], ['34.66', '37.204'], ['37.287', '38.58'], ['39.456', '43.669'], ['43.752', '47.297'], ['47.381', '49.55'], ]; var started = false; var internmap = through2.obj(function(arr, enc, cb) { var rowText = (started ? '\n' : '') + arr.join('\t'); started = true; cb(null, rowText); }) data.forEach(function(r) { internmap.write(r); }) internmap.end(); internmap.pipe(stream); 

https://www.postgresql.org/docs/current/static/sql-copy.html

Delimitador

Especifica el carácter que separa las columnas dentro de cada fila (línea) del archivo. El valor predeterminado es un carácter de tabulación en formato de texto , una coma en formato CSV. Este debe ser un único carácter de un byte. Esta opción no está permitida cuando se utiliza el formato binario.

intente usar un delimitador no predeterminado (ya que la tabulación se puede reemplazar en copiar / pegar), por ejemplo:

 t=# create table intern(starttime float,endtime float); CREATE TABLE t=# \! cat 1 COPY intern(starttime,endtime) FROM STDIN delimiter ';'; 1;4 6;12.074 13.138;16.183 17.226;21.605 22.606;24.733 24.816;27.027 31.657;33.617 34.66;37.204 37.287;38.58 39.456;43.669 43.752;47.297 47.381;49.55 49.633;54.68 54.763;58.225 59.142;62.98 64.189;68.861 69.82;71.613 72.364;76.201 76.285;78.787 78.871;81.832 \. t=# \i 1 COPY 20 

También en tu pregunta te falta \. , intenta escribir en psql – verás instrucciones:

 t=# COPY intern(starttime,endtime) FROM STDIN delimiter ';'; Enter data to be copied followed by a newline. End with a backslash and a period on a line by itself. 

Termine con una barra invertida y un punto en una línea por sí mismo.

    Intereting Posts