PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

स्वचालित रूप से एक तालिका बनाने के लिए पोस्टग्रेज़ में एक एक्सएमएल स्कीमा आयात करना और फिर इसे एक एक्सएमएल फ़ाइल के साथ पॉप्युलेट करना?

पोस्टग्रेएसक्यूएल में एक्सएमएल फाइलों को आयात करने के शायद एक हजार तरीके हैं, लेकिन यहां एक विकल्प है जो मुझे लागू करने में काफी आसान लगता है और पहले से ही बड़े एक्सएमएल दस्तावेज़ों (120 जीबी +) के साथ परीक्षण किया जा चुका है।

अपनी एक्सएमएल फ़ाइल के आकार के आधार पर, इसे विभाजित करने पर विचार करें। ऐसा करने के लिए एक बढ़िया टूल है 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);

कोड bellow XML फ़ाइलों को एक अस्थायी <में आयात करता है मजबूत>अनलॉग तालिका और अननेस्ट उन्हें तालिका में t एक CTE का उपयोग करना (खंड के साथ उर्फ) नोड द्वारा <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. JOOQ PostgreSql से तालिका-मूल्यवान अतिभारित प्रक्रियाओं को उत्पन्न नहीं कर रहा है

  2. PostgreSQL Sqlalchemy कमिटमेंट में बहुत समय लगता है

  3. पोस्टग्रेस्क्ल हाइबरनेट में उपयोगकर्ता नाम की तालिका का उपयोग करने में असमर्थ

  4. Postgresql superuser के लिए कोई पासवर्ड संकेत नहीं

  5. प्रति माह सभी दिनों की सूची बनाएं और प्रत्येक दिन को समान रूप से विभाजित करें