OK, đây là giải pháp của tôi.
Tôi đăng một câu trả lời chi tiết hơn trên blog Persagen.com của mình.
Về cơ bản, tôi quyết định thay thế DO $$DECLARE ...
(được mô tả trong SO 49950384) ủng hộ cách tiếp cận đơn giản, bên dưới.
Sau đó, tôi có thể truy cập biến chia sẻ BASH / PSQL, :bash_var
, do đó:
xpath('//metabolite', XMLPARSE(DOCUMENT convert_from(pg_read_binary_file(:'bash_var'))))
Đây là một tập lệnh SQL mẫu, minh họa cách sử dụng đó:
hmdb.sql
\c hmdb
CREATE TABLE hmdb_identifiers (
id SERIAL,
accession VARCHAR(15) NOT NULL,
name VARCHAR(300) NOT NULL,
cas_number VARCHAR(12),
pubchem_cid INT,
PRIMARY KEY (id),
UNIQUE (accession)
);
\echo '\n[hmdb.sql] bash_var:' :bash_var '\n'
-- UPDATE (2019-05-15): SEE MY COMMENTS BELOW RE: TEMP TABLE!
CREATE TEMP TABLE tmp_table AS
SELECT
(xpath('//accession/text()', x))[1]::text::varchar(15) AS accession
,(xpath('//name/text()', x))[1]::text::varchar(300) AS name
,(xpath('//cas_registry_number/text()', x))[1]::text::varchar(12) AS cas_number
,(xpath('//pubchem_compound_id/text()', x))[1]::text::int AS pubchem_cid
-- FROM unnest(xpath('//metabolite', XMLPARSE(DOCUMENT convert_from(pg_read_binary_file('hmdb/hmdb.xml'), 'UTF8')))) x
FROM unnest(xpath('//metabolite', XMLPARSE(DOCUMENT convert_from(pg_read_binary_file(:'bash_var'), 'UTF8')))) x
;
INSERT INTO hmdb_identifiers (accession, name, cas_number, pubchem_cid)
SELECT lower(accession), lower(name), lower(cas_number), pubchem_cid FROM tmp_table;
DROP TABLE tmp_table;
Ghi chú tập lệnh SQL:
-
Trong các câu lệnh xpath, tôi đọc lại
::text
(ví dụ:::text::varchar(15)
) trên lược đồ bảng Postgres. -
Đáng kể hơn, nếu tôi không đúc lại các kiểu dữ liệu trong câu lệnh xpath và một mục nhập trường (ví dụ:
name
length) vượt quá SQLvarchar(300)
giới hạn độ dài, những dữ liệu đó đã gây ra lỗi PSQL và bảng không cập nhật (tức là kết quả bảng trống).
Tôi đã tải lên các tệp dữ liệu XML được sử dụng trong câu trả lời này tại Gist này
https://gist.github.com/victoriastuart/d1b1959bd31e4de5ed951ff4fe3c3184
Liên kết trực tiếp:
-
hmdb_metabolites_5000-01.xml
-
hmdb_metabolites_5000-02.xml
-
hmdb_metabolites_5000-03.xml
-
Nguồn:HMDB.ca
- Trích dẫn
CẬP NHẬT (2019-05-15)
Trong công việc tiếp theo, được trình bày chi tiết trong bài đăng blog nghiên cứu của tôi Xuất văn bản thuần túy sang PostgreSQL, tôi tải trực tiếp dữ liệu XML vào PostgreSQL, thay vì sử dụng bảng tạm thời.
TL / DR. Trong dự án đó, tôi đã quan sát thấy những cải tiến sau.
Parameter | Temp Tables | Direct Import | Reduction
Time: | 1048 min | 1.75 min | 599x
Space: | 252,000 MB | 18 MB | 14,000x