2012-03-19 28 views
9

La documentación del hstore solo habla sobre el uso de "insertar" en hstore una fila a la vez. ¿Hay alguna forma de hacer una carga masiva de varias filas de 100k que podrían ser megabytes o Gigs en un almacén de postgres?Cargando una gran cantidad de datos en Postgres Hstore

Los comandos de copia parece funcionar sólo para subir archivos CSV columnas

Podría alguien publicar un ejemplo? Preferiblemente una solución que funciona con Python/psycopg

Respuesta

3

tanto inserto y copiar parece funcionar de manera natural para mí

create table b(h hstore); 
insert into b(h) VALUES ('a=>1,b=>2'::hstore), ('c=>2,d=>3'::hstore); 
select * from b; 
     h   
-------------------- 
"a"=>"1", "b"=>"2" 
"c"=>"2", "d"=>"3" 
(2 rows) 

$ cat > /tmp/t.tsv 
a=>1,b=>2 
c=>2,d=>3 
^d 

copy b(h) from '/tmp/t.tsv'; 
select * from b; 
     h   
-------------------- 
"a"=>"1", "b"=>"2" 
"c"=>"2", "d"=>"3" 
"a"=>"1", "b"=>"2" 
"c"=>"2", "d"=>"3" 
(4 rows) 
5

Las respuestas anteriores parece incompleta en que si se intenta copiar en varias columnas que incluye una columna con un tipo de hstore y utilizar un delimitador de coma, COPIA se confunde, como:

$ cat test 
1,a=>1,b=>2,a 
2,c=>3,d=>4,b 
3,e=>5,f=>6,c 

create table b(a int4, h hstore, c varchar(10)); 
CREATE TABLE; 
copy b(a,h,c) from 'test' CSV; 
ERROR: extra data after last expected column 
CONTEXT: COPY b, line 1: "1,a=>1,b=>2,a" 

mismo modo:

copy b(a,h,c) from 'test' DELIMITER ','; 
ERROR: extra data after last expected column 
CONTEXT: COPY b, line 1: "1,a=>1,b=>2,a" 

Esto se puede solucionar, sin embargo, mediante la importación como CSV y citando el campo para ser importados en hstore:

$ cat test 
1,"a=>1,b=>2",a 
2,"c=>3,d=>4",b 
3,"e=>5,f=>6",c 

copy b(a,h,c) from 'test' CSV; 
COPY 3 
select h from b; 
     h   
-------------------- 
"a"=>"1", "b"=>"2" 
"c"=>"3", "d"=>"4" 
"e"=>"5", "f"=>"6" 
(3 rows) 

Citando sólo se permite en formato CSV, por lo que la importación como un archivo CSV que se requiere, pero se puede establezca explícitamente el delimitador de campo y el carácter de comillas en valores que no sean ',' y '"' utilizando los argumentos DELIMITER y QUOTE para COPY.

0

Definitivamente puede hacer esto con el comando binario de copia.

No conozco una lib de Python que pueda hacer esto, pero tengo una de ruby ​​que puede ayudarlo a comprender las codificaciones de las columnas.

https://github.com/pbrumm/pg_data_encoder

Cuestiones relacionadas