Добре, ето моето решение.
Публикувам по-подробен отговор в моя блог Persagen.com.
По принцип реших да отменя DO $$DECLARE ...
подход (описан в SO 49950384) в полза на опростения подход, по-долу.
След това имам достъп до споделената променлива BASH / PSQL, :bash_var
, така:
xpath('//metabolite', XMLPARSE(DOCUMENT convert_from(pg_read_binary_file(:'bash_var'))))
Ето примерен SQL скрипт, илюстриращ това използване:
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;
Бележки за SQL скрипт:
-
В изразите xpath преобразувам
::text
(напр.:::text::varchar(15)
) според схемата на таблицата на Postgres. -
Още по-важно, ако не го направих преработете типовете данни в израза xpath и полето (напр.
name
дължина) надвишава SQLvarchar(300)
ограничение за дължина, тези данни доведоха до PSQL грешка и таблицата не се актуализира (т.е. резултати от празна таблица).
Качих XML файловете с данни, използвани в този отговор в този Gist
https://gist.github.com/victoriastuart/d1b1959bd31e4de5ed951ff4fe3c3184
Директни връзки:
-
hmdb_metabolites_5000-01.xml
-
hmdb_metabolites_5000-02.xml
-
hmdb_metabolites_5000-03.xml
-
Източник:HMDB.ca
- Цитиране
АКТУАЛИЗИРАНЕ (2019-05-15)
В последващата работа, подробно описана в публикацията ми в изследователския блог, Експортиране на обикновен текст към PostgreSQL, директно зареждам XML данни в PostgreSQL, вместо да използвам временни таблици.
TL/DR. В този проект забелязах следните подобрения.
Parameter | Temp Tables | Direct Import | Reduction
Time: | 1048 min | 1.75 min | 599x
Space: | 252,000 MB | 18 MB | 14,000x