OK、これが私の解決策です。
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
長さ)がSQLvarchar(300)
を超えました 長さの制限により、これらのデータはPSQLエラーをスローし、テーブルは更新されませんでした(つまり、テーブルが空白になります)。
この回答で使用したXMLデータファイルをこの要点にアップロードしました
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