ठीक है, ये रहा मेरा समाधान।
मैं अपने 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)
) पोस्टग्रेज टेबल स्कीमा के अनुसार। -
अधिक महत्वपूर्ण रूप से, अगर मैंने नहीं किया होता डेटाटाइप्स को xpath स्टेटमेंट और एक फील्ड एंट्री (जैसे
name
. में रीकास्ट करें) लम्बाई) SQLvarchar(300)
. को पार कर गया है लंबाई सीमा, उन डेटा ने एक पीएसक्यूएल त्रुटि फेंक दी और तालिका अपडेट नहीं हुई (यानी एक खाली तालिका परिणाम)।
मैंने इस उत्तर में प्रयुक्त 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)
फॉलो-ऑन कार्य में, मेरे शोध ब्लॉग पोस्ट में पोस्टग्रेएसक्यूएल को सादा पाठ निर्यात करना, मैं अस्थायी तालिकाओं का उपयोग करने के बजाय सीधे पोस्टग्रेएसक्यूएल में एक्सएमएल डेटा लोड करता हूं।
टीएल/डॉ. उस परियोजना में, मैंने निम्नलिखित सुधार देखे।
Parameter | Temp Tables | Direct Import | Reduction
Time: | 1048 min | 1.75 min | 599x
Space: | 252,000 MB | 18 MB | 14,000x