sql >> Database teknologi >  >> RDS >> PostgreSQL

Adgang til eksterne XML-filer som variabler i et PSQL-script (hentet fra et bash-script)

OK, her er min løsning.

Jeg poster et mere detaljeret svar på min Persagen.com blog.

Grundlæggende besluttede jeg at ophæve DO $$DECLARE ... fremgangsmåde (beskrevet i SO 49950384) til fordel for den forenklede fremgangsmåde nedenfor.

Jeg kan derefter få adgang til den delte BASH / PSQL variabel, :bash_var , således:

xpath('//metabolite', XMLPARSE(DOCUMENT convert_from(pg_read_binary_file(:'bash_var'))))

Her er et eksempel på et SQL-script, der illustrerer denne brug:

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-scriptnoter:

  • I xpath-sætningerne omarbejdede jeg ::text (f.eks.:::text::varchar(15) ) ifølge Postgres-tabelskemaet.

  • Mere markant, hvis jeg ikke gjorde det omforme datatyperne i xpath-sætningen og en feltindgang (f.eks. name længde) overskredet SQL varchar(300) længdegrænse, disse data gav en PSQL-fejl, og tabellen blev ikke opdateret (dvs. en tom tabelresultater).

Jeg uploadede XML-datafilerne, der blev brugt i dette svar på denne Gist

https://gist.github.com/victoriastuart/d1b1959bd31e4de5ed951ff4fe3c3184

Direkte links:

  • hmdb_metabolites_5000-01.xml

  • hmdb_metabolites_5000-02.xml

  • hmdb_metabolites_5000-03.xml

  • Kilde:HMDB.ca

    • Citat

OPDATERING (2019-05-15)

Som opfølgningsarbejde, som er beskrevet i mit forskningsblog-indlæg Eksport af almindelig tekst til PostgreSQL, indlæser jeg XML-data direkte i PostgreSQL i stedet for at bruge midlertidige tabeller.

TL/DR. I det projekt observerede jeg følgende forbedringer.

Parameter | Temp Tables  | Direct Import | Reduction
    Time: | 1048 min     | 1.75 min      | 599x
   Space: | 252,000 MB   | 18 MB         | 14,000x



  1. PostgreSQL v13 implementering og skalering med ClusterControl 1.8.2

  2. Hvorfor det er vigtigt at begrænse brugeradgang i din database

  3. Begræns antallet af returnerede rækker i en SQL Server-forespørgsel ved at bruge TOP-klausulen

  4. Sådan får du SQLite db-værdier i Arraylist til Listview