PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Truy cập các tệp XML bên ngoài dưới dạng các biến trong tập lệnh PSQL (lấy nguồn từ tập lệnh bash)

OK, đây là giải pháp của tôi.

Tôi đăng một câu trả lời chi tiết hơn trên blog Persagen.com của mình.

Về cơ bản, tôi quyết định thay thế DO $$DECLARE ... (được mô tả trong SO 49950384) ủng hộ cách tiếp cận đơn giản, bên dưới.

Sau đó, tôi có thể truy cập biến chia sẻ BASH / PSQL, :bash_var , do đó:

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

Đây là một tập lệnh SQL mẫu, minh họa cách sử dụng đó:

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;

Ghi chú tập lệnh SQL:

  • Trong các câu lệnh xpath, tôi đọc lại ::text (ví dụ:::text::varchar(15) ) trên lược đồ bảng Postgres.

  • Đáng kể hơn, nếu tôi không đúc lại các kiểu dữ liệu trong câu lệnh xpath và một mục nhập trường (ví dụ:name length) vượt quá SQL varchar(300) giới hạn độ dài, những dữ liệu đó đã gây ra lỗi PSQL và bảng không cập nhật (tức là kết quả bảng trống).

Tôi đã tải lên các tệp dữ liệu XML được sử dụng trong câu trả lời này tại Gist này

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

Liên kết trực tiếp:

  • hmdb_metabolites_5000-01.xml

  • hmdb_metabolites_5000-02.xml

  • hmdb_metabolites_5000-03.xml

  • Nguồn:HMDB.ca

    • Trích dẫn

CẬP NHẬT (2019-05-15)

Trong công việc tiếp theo, được trình bày chi tiết trong bài đăng blog nghiên cứu của tôi Xuất văn bản thuần túy sang PostgreSQL, tôi tải trực tiếp dữ liệu XML vào PostgreSQL, thay vì sử dụng bảng tạm thời.

TL / DR. Trong dự án đó, tôi đã quan sát thấy những cải tiến sau.

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. Làm thế nào để thêm vào xóa các ràng buộc tầng?

  2. Lỗi khi cài đặt psycopg2 ==2.6.2

  3. Sự cố kết nối với SQLAlchemy và nhiều quy trình

  4. Chuyển đổi dự phòng cho PostgreSQL Replication 101

  5. PG ::Lỗi:SELECT DISTINCT, ORDER BY biểu thức phải xuất hiện trong danh sách lựa chọn