PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Импортиране на xml схема в postgres за автоматично създаване на таблица и след това попълването й с xml файл?

Вероятно има хиляди начини за импортиране на XML файлове в PostgreSQL, но ето една алтернатива, която намирам за доста лесна за изпълнение и вече е тествана с големи 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изтрия дублиращи се записи?

  2. Psql не можа да се свърже със сървъра:Няма такъв файл или директория, грешка 5432?

  3. Преброяване на поява на стойности в сериализиран атрибут (масив) в таблото за управление на Active Admin (Rails, Active admin 1.0, Postgresql база данни, postgres_ext gem)

  4. Персонализирана агрегатна функция

  5. PostgreSQL - Преименуване на база данни