PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengakses file XML eksternal sebagai variabel dalam skrip PSQL (bersumber dari skrip bash)

Oke, inilah solusi saya.

Saya memposting jawaban yang lebih rinci di blog Persegen.com saya.

Pada dasarnya, saya memutuskan untuk membatalkan DO $$DECLARE ... pendekatan (dijelaskan dalam SO 49950384) mendukung pendekatan yang disederhanakan, di bawah ini.

Saya kemudian dapat mengakses variabel bersama BASH / PSQL, :bash_var , demikian:

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

Berikut adalah contoh skrip SQL, yang menggambarkan penggunaan itu:

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;

Catatan skrip SQL:

  • Dalam pernyataan xpath saya menyusun kembali ::text (mis.:::text::varchar(15) ) per skema tabel Postgres.

  • Lebih penting lagi, jika saya tidak menyusun kembali tipe data dalam pernyataan xpath dan entri bidang (mis. name panjang) melebihi SQL varchar(300) batas panjang, data tersebut menimbulkan kesalahan PSQL dan tabel tidak diperbarui (yaitu hasil tabel kosong).

Saya mengunggah file data XML yang digunakan dalam jawaban ini di Intisari ini

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

Tautan langsung:

  • hmdb_metabolites_5000-01.xml

  • hmdb_metabolites_5000-02.xml

  • hmdb_metabolites_5000-03.xml

  • Sumber:HMDB.ca

    • Kutipan

PERBARUI (2019-05-15)

Dalam pekerjaan selanjutnya, yang dirinci dalam posting blog penelitian saya Mengekspor Teks Biasa ke PostgreSQL, saya langsung memuat data XML ke PostgreSQL, daripada menggunakan tabel sementara.

TL/DR. Dalam proyek itu, saya mengamati peningkatan berikut.

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. pgpredict – Analisis prediktif di PostgreSQL

  2. Bagaimana Asin() Bekerja di PostgreSQL

  3. kueri sql yang mengelompokkan item berbeda ke dalam ember

  4. Fungsi PL/pgSQL:Cara mengembalikan tabel normal dengan banyak kolom menggunakan pernyataan eksekusi

  5. Bagaimana INTERSECT Bekerja di PostgreSQL