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

xmlスキーマをpostgresにインポートして自動的にテーブルを作成し、それにxmlファイルを入力しますか?

    XMLファイルをPostgreSQLにインポートする方法はおそらく1000通りありますが、これは実装が非常に簡単で、大きなxmlドキュメント(120GB以上)ですでにテストされている代替方法です

    XMLファイルのサイズに応じて、分割することを検討してください。そのための素晴らしいツールは、 xml_splitです。 。このコマンドは、file.xmlを分割します 最大100MBの小さなファイルの場合:

    xml_split -n 5 -l 1 -s 100MB file.xml
    

    ファイルを適切なサイズに分割したら、メモリが不足するリスクを冒すことなく、ファイルのインポートを開始できます。

    次のXMLファイル構造を考えてみましょう...

    <?xml version="1.0"?>
    <t>
        <foo>
            <id j="a">1</id>
            <val>bar1</val>
        </foo>
        <foo>
            <id j="b">8</id>
            <val>bar1</val>
        </foo>
        <foo>
            <id j="c">5</id>
            <val>bar1</val>
        </foo>
        <foo>
            <id j="b">2</id>
        </foo>
    </t>
    

    ...そして次のターゲットテーブル。XMLレコードを挿入します。

    CREATE TABLE t (id TEXT, entry XML);
    

    次のコードは、XMLファイルを一時的な<にインポートします。強い>ログに記録されていない テーブルと unnest それらをテーブルにt CTEを使用する (別名WITH句)ノード<foo>による 。コマンドperl -pe 's/\n/\\n/g' 改行文字を\\nに置き換えます Premature end of dataが発生しないようにする 例外:

    #!/bin/bash
    
    psql testdb -c "CREATE UNLOGGED TABLE tmp (entry xml);"
    
    for f in /path/to/your/files/;do
    
        cat $f | perl -pe 's/\n/\\n/g' |psql testdb -c "COPY tmp FROM STDIN;"
        psql testdb -c "
        WITH j AS (
          SELECT UNNEST(XPATH('//t/foo',entry)) AS entry FROM tmp
        )
          INSERT INTO t 
          SELECT XPATH('//foo/id/text()',j.entry),j.entry FROM j;
    
          TRUNCATE TABLE tmp;"
    
    done
    
    psql testdb -c "DROP TABLE tmp;"
    

    そしてここにあなたのデータがあります:

    testdb=# SELECT * FROM t;
     id  |          entry           
    -----+--------------------------
     {1} | <foo>                   +
         |         <id j="a">1</id>+
         |         <val>bar1</val> +
         |     </foo>
     {8} | <foo>                   +
         |         <id j="b">8</id>+
         |         <val>bar1</val> +
         |     </foo>
     {5} | <foo>                   +
         |         <id j="c">5</id>+
         |         <val>bar1</val> +
         |     </foo>
     {2} | <foo>                   +
         |         <id j="b">2</id>+
         |     </foo>
    (4 Zeilen)
    



    1. Rails:postgresでタイムゾーンを使用して時間列を作成する方法

    2. DBMS_LOB.SUBSTR()が文字列バッファをスローしますエラーが小さすぎます

    3. SQLでASキーワードを使用せずにエイリアシングを実行できる場合、ASキーワードを使用する意味は何ですか?

    4. DDLが同時に使用されている場合にmysqldumpとシングルトランザクションを使用して正しいダンプを取得するにはどうすればよいですか?