PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengimpor skema xml ke postgres untuk membuat tabel secara otomatis dan kemudian mengisinya dengan file xml?

Mungkin ada seribu cara untuk mengimpor file XML ke PostgreSQL, tetapi berikut ini adalah alternatif yang menurut saya cukup mudah diterapkan dan sudah diuji dengan dokumen xml besar (120GB+)

Bergantung pada ukuran file XML Anda, pertimbangkan untuk membaginya. Alat hebat untuk melakukannya adalah xml_split . Perintah ini membagi file.xml dalam file yang lebih kecil dengan maksimum 100MB:

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

Setelah Anda membagi file dalam ukuran yang wajar, Anda dapat mulai mengimpornya tanpa risiko kehabisan memori.

Mari kita perhatikan struktur file XML berikut ...

<?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>

... dan tabel target berikut, tempat kita akan menyisipkan data XML.

CREATE TABLE t (id TEXT, entry XML);

Kode di bawah ini mengimpor file XML ke tidak masuk log tabel dan unnest mereka ke dalam tabel t menggunakan CTE (alias DENGAN klausa) oleh simpul <foo> . Perintah perl -pe 's/\n/\\n/g' mengganti karakter baris baru dengan \\n sehingga Anda tidak mendapatkan Premature end of data pengecualian:

#!/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;"

Dan ini data Anda:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ENUM ketik SQLAlchemy dengan PostgreSQL

  2. Aktifkan dukungan SSL untuk pgsql

  3. Ganti karakter unicode di PostgreSQL

  4. breakpoints di Eclipse menggunakan postgresql

  5. Ordinal Tidak Ditemukan saat menjalankan alat Diesel CLI