PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

एक पीएसक्यूएल स्क्रिप्ट में बाहरी एक्सएमएल फाइलों को चर के रूप में एक्सेस करना (बैश स्क्रिप्ट से सोर्स किया गया)

ठीक है, ये रहा मेरा समाधान।

मैं अपने 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 . में रीकास्ट करें) लम्बाई) SQL varchar(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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL के लिए स्लोनी प्रतिकृति के लिए एक विशेषज्ञ की मार्गदर्शिका

  2. पांडा अद्यतन sql

  3. Django और PostgreSQL को दो अलग-अलग EC2 उदाहरणों पर सेट करना

  4. "PostgreSQL 9.0 उच्च प्रदर्शन" पुस्तक प्रकाशित हो चुकी है।

  5. PostgreSQL त्रुटि लॉग को कैसे डिकोड करें