2012-03-19 36 views
9

Tài liệu hstore chỉ nói về việc sử dụng "chèn" vào hstore một hàng tại một thời điểm. Có cách nào để thực hiện tải lên hàng loạt của một số hàng 100k có thể là megabyte hoặc Hợp đồng biểu diễn vào một kho lưu trữ sau.Tải lượng lớn dữ liệu vào Postgres Hstore

Các lệnh sao chép dường như chỉ làm việc để tải lên file csv cột

Ai đó có thể gửi một ví dụ? Tốt nhất là một giải pháp mà làm việc với python/psycopg

Trả lời

3

cả chèn và sao chép xuất hiện để làm việc theo những cách tự nhiên đối với tôi

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

Những câu trả lời ở trên có vẻ không đầy đủ ở chỗ nếu bạn cố gắng sao chép trong nhiều cột bao gồm một cột với một loại hstore và sử dụng một delimiter dấu phẩy, COPY bị nhầm lẫn, như:

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

Tương tự:

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" 

này có thể được cố định, tuy nhiên, bằng cách nhập như một CSV và trích dẫn lĩnh vực này để được nhập khẩu vào 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) 

Trích dẫn chỉ được phép ở định dạng CSV, do nhập khẩu như CSV là cần thiết, nhưng bạn có thể đặt rõ ràng dấu phân tách trường và ký tự trích dẫn thành các giá trị không ',' và '' 'bằng cách sử dụng các đối số DELIMITER và QUOTE cho COPY.

0

Bạn chắc chắn có thể làm điều này với lệnh sao chép nhị phân.

Tôi không biết về một lib python có thể làm điều này, nhưng tôi có một ruby ​​có thể giúp bạn hiểu các mã hóa cột.

https://github.com/pbrumm/pg_data_encoder

Các vấn đề liên quan