sql >> Databáze >  >> RDS >> PostgreSQL

Přístup k externím souborům XML jako proměnným ve skriptu PSQL (zdrojem ze skriptu bash)

OK, tady je moje řešení.

Podrobnější odpověď zveřejňuji na svém blogu Persagen.com.

V podstatě jsem se rozhodl zrušit DO $$DECLARE ... přístup (popsaný v SO 49950384) ve prospěch zjednodušeného přístupu níže.

Poté mám přístup ke sdílené proměnné BASH / PSQL, :bash_var , tedy:

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

Zde je ukázkový skript SQL ilustrující toto použití:

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;

Poznámky skriptu SQL:

  • V příkazech xpath jsem přeformuloval ::text (např.:::text::varchar(15) ) podle schématu tabulky Postgres.

  • Významněji, pokud ne přetypovat datové typy v příkazu xpath a položku pole (např. name délka) překročila hodnotu SQL varchar(300) délka limitu, tato data vyhodila chybu PSQL a tabulka se neaktualizovala (tj. výsledek prázdné tabulky).

Nahrál jsem datové soubory XML použité v této odpovědi v tomto Gist

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

Přímé odkazy:

  • hmdb_metabolites_5000-01.xml

  • hmdb_metabolites_5000-02.xml

  • hmdb_metabolites_5000-03.xml

  • Zdroj:HMDB.ca

    • Citace

AKTUALIZACE (2019-05-15)

V následné práci, podrobně popsané v mém výzkumném blogovém příspěvku Exportování prostého textu do PostgreSQL, načítám data XML přímo do PostgreSQL, místo abych používal dočasné tabulky.

TL/DR. V tomto projektu jsem pozoroval následující vylepšení.

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



  1. SQL Server 2008 – Jak vrátím uživatelsky definovaný typ tabulky z funkce s hodnotou tabulky?

  2. Nejlepší způsob, jak uložit obrázky, které pocházejí ze serveru v Androidu

  3. Databáze SQL Server Statistiky využití CPU

  4. Jak najít řetězec v řetězci na serveru SQL