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
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.