PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Достъп до външни XML файлове като променливи в PSQL скрипт (източник от bash скрипт)

Добре, ето моето решение.

Публикувам по-подробен отговор в моя блог 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) ) според схемата на таблицата на Postgres.

  • Още по-важно, ако не го направих преработете типовете данни в израза xpath и полето (напр. name дължина) надвишава SQL varchar(300) ограничение за дължина, тези данни доведоха до PSQL грешка и таблицата не се актуализира (т.е. резултати от празна таблица).

Качих 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)

В последващата работа, подробно описана в публикацията ми в изследователския блог, Експортиране на обикновен текст към PostgreSQL, директно зареждам XML данни в PostgreSQL, вместо да използвам временни таблици.

TL/DR. В този проект забелязах следните подобрения.

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. Heroku Rails 4 не можа да се свърже със сървъра:връзката е отказана

  3. Ефективна стратегия за оставяне на одитна следа/история на промените за DB приложения?

  4. Как да свързвам SQL променливи в PHP?

  5. Вмъкване на данни в таблици, свързани с външен ключ