He intentado durante horas llenar una base de datos de Postgres 12 desde un archivo CSV usando el comando COPY . La tabla en cuestión tiene un campo hstore y uno de los pares clave-valor tiene una comilla doble " en el valor.
La base de datos de Postgres se crea así.
CREATE TABLE test ( title VARCHAR(20), tags hstore ); El archivo CSV usa tabs como delimitadores y se ve así
My Title | name=>"""Paul "Butch" Newman""", job=>actorEl valor del nombre debe estar entre comillas dobles y escapar porque contiene espacios.
| representa un carácter de tabulación.
Mi declaración de importación se ve así:
COPY test (title, tags) FROM '/var/lib/postgresql/data/test.csv' DELIMITER E'\t' CSV ENCODING 'UTF8';La base de datos se llena como se esperaba, pero cuando la consulto con
SELECT tags->'name' as name FROM test;
pgAdmin 4 regresa
Paul Butch Newman
en vez de
Paul "Butch" Newman
Mi pregunta es ¿cómo obtener las comillas dobles en el valor real de hstore?
Encontré muchas respuestas sobre comillas dobles para la importación en campos de texto. Pero aquí la importación está en un campo hstore y el valor debe estar entre comillas dobles aquí, ya que contiene espacios.
¡Gracias!
Acabo de jugar con esto localmente.
Supongo que tiene control sobre el formato de su archivo de entrada.
El problema es que el formato CSV convierte "" que se encuentra dentro de los elementos encerrados entre comillas dobles a " al pasarlos.
Esto funcionó para mí para obtener el resultado que desea:
My Title | name=>"""Paul \""Butch\"" Newman""", job=>actor Una vez que el controlador de CSV termina con su escape al convertir las comillas dobles dobles en comillas simples, pasa name=>"Paul \"Butch\" Newman", job=>actor al insert , que es como lo escribiría como un literal en psql o PgAdmin.
select tags->'name' as name from test_hstor; name --------------------- Paul "Butch" Newman (1 row) Por curiosidad, verifiqué importarlo como texto en lugar de csv, y el registro de entrada debe contener name=>"Paul \\"Butch\\" Newman", job=>actor para que funcione correctamente.