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ファイルを一時的な<にインポートします。強い>ログに記録されていない
テーブルと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)