hstore 文档只讨论一次使用“插入”到 hstore 中的一行。无论如何要批量上传几 100k 行,可能是兆字节或 Gigs 到 postgres hstore。
复制命令似乎仅适用于上传 csv 文件列
有人可以发布一个例子吗?最好是与 python/psycopg 一起使用的解决方案
hstore 文档只讨论一次使用“插入”到 hstore 中的一行。无论如何要批量上传几 100k 行,可能是兆字节或 Gigs 到 postgres hstore。
复制命令似乎仅适用于上传 csv 文件列
有人可以发布一个例子吗?最好是与 python/psycopg 一起使用的解决方案
上面的答案似乎不完整,因为如果您尝试复制多个列,包括具有 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 参数将字段分隔符和引号字符显式设置为非 ',' 和 '"' 值。
插入和复制对我来说似乎都以自然的方式工作
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)
您绝对可以使用复制二进制命令来执行此操作。
我不知道可以执行此操作的 python 库,但我有一个可以帮助您理解列编码的 ruby 库。