sql >> データベース >  >> RDS >> PostgreSQL

PSQLスクリプト(bashスクリプトから供給)の変数として外部XMLファイルにアクセスする

    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 長さ)がSQL varchar(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
    



    1. MySQLで月間アクティブユーザー(MAU)を計算する方法

    2. Microsoft SQL Server2008R2のインデックスの自動インクリメント

    3. MySQLデータベースにデータを挿入するにはどうすればよいですか?

    4. ON [PRIMARY]とはどういう意味ですか?