sql >> Database >  >> RDS >> PostgreSQL

Toegang krijgen tot externe XML-bestanden als variabelen in een PSQL-script (afkomstig van een bash-script)

Oké, hier is mijn oplossing.

Ik plaats een meer gedetailleerd antwoord op mijn Persagen.com-blog.

Kortom, ik heb besloten om de DO $$DECLARE ... . af te schaffen benadering (beschreven in SO 49950384) ten gunste van de vereenvoudigde benadering, hieronder.

Ik heb dan toegang tot de gedeelde variabele BASH / PSQL, :bash_var , dus:

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

Hier is een voorbeeld van een SQL-script dat dat gebruik illustreert:

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

  • In de xpath-statements herschik ik de ::text (bijv.:::text::varchar(15) ) volgens het Postgres-tabelschema.

  • Belangrijker nog, als ik niet herschik de datatypes in de xpath-instructie en een veldinvoer (bijv. name lengte) overschreed de SQL varchar(300) lengtelimiet, veroorzaakten die gegevens een PSQL-fout en werd de tabel niet bijgewerkt (d.w.z. er ontstond een lege tabel).

Ik heb de XML-gegevensbestanden geüpload die in dit antwoord worden gebruikt in deze samenvatting

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

Directe links:

  • hmdb_metabolites_5000-01.xml

  • hmdb_metabolites_5000-02.xml

  • hmdb_metabolites_5000-03.xml

  • Bron:HMDB.ca

    • Citaat

UPDATE (2019-05-15)

In vervolgwerk, beschreven in mijn onderzoeksblogpost Platte tekst exporteren naar PostgreSQL, laad ik XML-gegevens rechtstreeks in PostgreSQL, in plaats van tijdelijke tabellen te gebruiken.

TL/DR. In dat project zag ik de volgende verbeteringen.

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



  1. Hoe u SQL Server-gegevens van een tabel naar een CSV-bestand exporteert?

  2. Java SQL FOUT:Relatietabelnaam bestaat niet

  3. Redenen om te upgraden naar SQL Server 2017

  4. Dilemma tabelnaamgeving:enkelvoud versus meervoudsnamen