10

hstore 文档只讨论一次使用“插入”到 hstore 中的一行。无论如何要批量上传几 100k 行,可能是兆字节或 Gigs 到 postgres hstore。

复制命令似乎仅适用于上传 csv 文件列

有人可以发布一个例子吗?最好是与 python/psycopg 一起使用的解决方案

4

3 回答 3

6

上面的答案似乎不完整,因为如果您尝试复制多个列,包括具有 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,但您可以使用 COPY 的 DELIMITER 和 QUOTE 参数将字段分隔符和引号字符显式设置为非 ',' 和 '"' 值。

于 2012-07-17T17:41:37.373 回答
3

插入和复制对我来说似乎都以自然的方式工作

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)
于 2012-03-19T15:16:08.687 回答
0

您绝对可以使用复制二进制命令来执行此操作。

我不知道可以执行此操作的 python 库,但我有一个可以帮助您理解列编码的 ruby​​ 库。

https://github.com/pbrumm/pg_data_encoder

于 2014-07-31T13:42:33.850 回答