PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Dostęp do zewnętrznych plików XML jako zmiennych w skrypcie PSQL (pochodzący ze skryptu bash)

OK, oto moje rozwiązanie.

Publikuję bardziej szczegółową odpowiedź na moim blogu Persagen.com.

Zasadniczo postanowiłem anulować DO $$DECLARE ... podejście (opisane w SO 49950384) na korzyść podejścia uproszczonego, poniżej.

Mam wtedy dostęp do zmiennej współdzielonej BASH / PSQL, :bash_var , a więc:

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

Oto przykładowy skrypt SQL ilustrujący to użycie:

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;

Uwagi dotyczące skryptu SQL:

  • W instrukcjach xpath przekształcam ::text (np.:::text::varchar(15) ) zgodnie ze schematem tabeli Postgres.

  • Co ważniejsze, gdybym nie przekształcić typy danych w instrukcji xpath i wpis w polu (np. name długość) przekroczyła SQL varchar(300) limit długości, te dane spowodowały błąd PSQL, a tabela nie została zaktualizowana (tj. wynik pustej tabeli).

Przesłałem pliki danych XML użyte w tej odpowiedzi w tym artykule

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

Linki bezpośrednie:

  • hmdb_metabolites_5000-01.xml

  • hmdb_metabolites_5000-02.xml

  • hmdb_metabolites_5000-03.xml

  • Źródło:HMDB.ca

    • Cytat

AKTUALIZACJA (15.05.2019)

W dalszej pracy, szczegółowo opisanej w moim poście na blogu badawczym Eksportowanie zwykłego tekstu do PostgreSQL, bezpośrednio ładuję dane XML do PostgreSQL, zamiast używać tabel tymczasowych.

TL/DR. W tym projekcie zaobserwowałem następujące ulepszenia.

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. Najlepsze narzędzia Open Source do migracji PostgreSQL

  2. Połącz wiele wierszy wyników z jednej kolumny w jedną, pogrupuj według innej kolumny

  3. Jak skonfigurować HikariCP dla postgresql?

  4. PostgreSQL:Ostrzeżenie:strona kodowa konsoli (437) różni się od strony kodowej Windows (1252)

  5. Mapuj pole punktu geometrii PostGIS za pomocą Hibernate na Spring Boot