sql >> Database teknologi >  >> RDS >> PostgreSQL

Importerer du et xml-skema til postgres for automatisk at oprette en tabel og derefter udfylde den med en xml-fil?

Der er sikkert tusinde måder at importere XML-filer til PostgreSQL på, men her er et alternativ, som jeg finder ret nemt at implementere og allerede er testet med store xml-dokumenter (120GB+)

Overvej at opdele den, afhængigt af størrelsen på din XML-fil. Et fantastisk værktøj til at gøre det er xml_split . Denne kommando opdeler file.xml i mindre filer med maksimalt 100MB:

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

Når du har opdelt dine filer i en rimelig størrelse, kan du begynde at importere dem uden at risikere at løbe tør for hukommelse.

Lad os overveje følgende XML-filstruktur ...

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

... og følgende måltabel, hvor vi indsætter XML-posterne.

CREATE TABLE t (id TEXT, entry XML);

Koden nedenfor importerer XML-filer til en midlertidig ulogget tabel og unnest dem i tabellen t ved hjælp af en CTE (aka WITH-sætning) af noden <foo> . Kommandoen perl -pe 's/\n/\\n/g' erstatter nye linjetegn med \\n så du ikke får en Premature end of data undtagelse:

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

Og her er dine 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. Eksporter SQL Server-data til CSV-fil

  2. hvordan man indstiller mysql datetype længde med sequelize-cli

  3. Forespørgselsfejl med tvetydigt kolonnenavn i SQL

  4. Overførsel af en tabelværdiparameter til en lagret procedure