Oke, inilah solusi saya.
Saya memposting jawaban yang lebih rinci di blog Persegen.com saya.
Pada dasarnya, saya memutuskan untuk membatalkan DO $$DECLARE ...
pendekatan (dijelaskan dalam SO 49950384) mendukung pendekatan yang disederhanakan, di bawah ini.
Saya kemudian dapat mengakses variabel bersama BASH / PSQL, :bash_var
, demikian:
xpath('//metabolite', XMLPARSE(DOCUMENT convert_from(pg_read_binary_file(:'bash_var'))))
Berikut adalah contoh skrip SQL, yang menggambarkan penggunaan itu:
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;
Catatan skrip SQL:
-
Dalam pernyataan xpath saya menyusun kembali
::text
(mis.:::text::varchar(15)
) per skema tabel Postgres. -
Lebih penting lagi, jika saya tidak menyusun kembali tipe data dalam pernyataan xpath dan entri bidang (mis.
name
panjang) melebihi SQLvarchar(300)
batas panjang, data tersebut menimbulkan kesalahan PSQL dan tabel tidak diperbarui (yaitu hasil tabel kosong).
Saya mengunggah file data XML yang digunakan dalam jawaban ini di Intisari ini
https://gist.github.com/victoriastuart/d1b1959bd31e4de5ed951ff4fe3c3184
Tautan langsung:
-
hmdb_metabolites_5000-01.xml
-
hmdb_metabolites_5000-02.xml
-
hmdb_metabolites_5000-03.xml
-
Sumber:HMDB.ca
- Kutipan
PERBARUI (2019-05-15)
Dalam pekerjaan selanjutnya, yang dirinci dalam posting blog penelitian saya Mengekspor Teks Biasa ke PostgreSQL, saya langsung memuat data XML ke PostgreSQL, daripada menggunakan tabel sementara.
TL/DR. Dalam proyek itu, saya mengamati peningkatan berikut.
Parameter | Temp Tables | Direct Import | Reduction
Time: | 1048 min | 1.75 min | 599x
Space: | 252,000 MB | 18 MB | 14,000x