Загрузка большого объема данных в Postgres Hstore

В документации hstore говорится только об использовании «insert» в hstore по одной строке за раз. Можно ли в любом случае выполнить массовую загрузку нескольких строк по 100 000, которые могут быть мегабайтами или гигабайтами, в хранилище postgres.

Команды копирования работают только для загрузки столбцов CSV-файлов.

Может ли кто-нибудь опубликовать пример? Предпочтительно решение, которое работает с python/psycopg.


person user1277928    schedule 19.03.2012    source источник


Ответы (3)


Приведенные выше ответы кажутся неполными в том смысле, что если вы попытаетесь скопировать несколько столбцов, включая столбец с типом hstore, и используете разделитель-запятую, COPY запутается, например:

$ 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"

Сходным образом:

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"

Однако это можно исправить, импортировав в формате CSV и указав в кавычках поле, которое нужно импортировать в 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)

Цитирование разрешено только в формате CSV, поэтому требуется импорт в формате CSV, но вы можете явно установить разделитель полей и символ кавычек на значения, отличные от ',' и '"', используя аргументы DELIMITER и QUOTE для COPY.

person nat    schedule 17.07.2012

и вставка, и копирование, кажется, работают естественным образом для меня

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)
person dbenhur    schedule 19.03.2012

Вы определенно можете сделать это с помощью команды копирования двоичных файлов.

Я не знаю библиотеки Python, которая может это сделать, но у меня есть ruby, которая может помочь вам понять кодировку столбцов.

https://github.com/pbrumm/pg_data_encoder

person Pete Brumm    schedule 31.07.2014