sql >> Databáze >  >> RDS >> PostgreSQL

Importujete schéma xml do postgres, aby se automaticky vytvořila tabulka a pak se naplnila souborem xml?

Existuje pravděpodobně tisíc způsobů, jak importovat soubory XML do PostgreSQL, ale zde je alternativa, kterou považuji za docela snadno implementovatelnou a je již testována s velkými dokumenty xml (120 GB+)

V závislosti na velikosti souboru XML zvažte jeho rozdělení. Skvělý nástroj k tomu je xml_split . Tento příkaz rozdělí file.xml v menších souborech o maximální velikosti 100 MB:

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

Jakmile budete mít soubory rozdělené v rozumné velikosti, můžete je začít importovat, aniž byste riskovali nedostatek paměti.

Podívejme se na následující strukturu souboru 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>

... a následující cílová tabulka, kam vložíme XML záznamy.

CREATE TABLE t (id TEXT, entry XML);

Níže uvedený kód importuje soubory XML do dočasného odhlášen tabulka a unnest do tabulky t pomocí CTE (aka klauzule WITH) uzlem <foo> . Příkaz perl -pe 's/\n/\\n/g' nahradí znaky nového řádku \\n abyste nedostali Premature end of data výjimka:

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

A zde jsou vaše data:

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. Příklady DAYNAME() – MySQL

  2. MySQL vs PostgreSQL pro webové aplikace

  3. Proč PostgreSQL nemá rád názvy tabulek VELKÝMI PÍSMENY?

  4. Jak spravovat dostupnost pokojů na základě obsazenosti dnů nebo měsíců