निर्यात Postgres तालिका को json के रूप में


35

वहाँ एक फ़ाइल के लिए json के रूप में टेबल डेटा निर्यात करने का एक तरीका है? मुझे आउटपुट लाइन से लाइन में होना चाहिए, जैसे:

{'id':1,'name':'David'}
{'id':2,'name':'James'}
...

संस्करण: पोस्ट संस्करण: 9.3.4

जवाबों:


48

करने के लिए एक बुनियादी परिचय के लिए यहाँ और प्रयास करेंPostgreSQLJSON

इसके अलावा, PostgreSQL प्रलेखन बहुत अच्छा है, इसलिए इसे यहां आज़माएं । की जाँच करें pretty_boolविकल्प।

आपका मूल प्रश्न था "क्या टेबल डेटा को निर्यात करने का एक तरीका है JSON"। आप इसे इस प्रारूप में चाहते थे

{'id':1,'name':'David'}
{'id':2,'name':'James'}
...

मेरे पास दौड़ने का PostgreSQLकोई उदाहरण नहीं था इसलिए मैंने इसे डाउनलोड, संकलित किया और 9.4 स्थापित किया।

इसका उत्तर देने के लिए, मैं सबसे पहले CREATEएक टेबल एड करता हूं (फ्रेड)

CREATE TABLE fred (mary INT, jimmy INT, paulie VARCHAR(20));

INSERT INTO fred VALUES (2,    43, 'asfasfasfd'      );
INSERT INTO fred VALUES (3,   435, 'ererere'         );
INSERT INTO fred VALUES (6, 43343, 'eresdfssfsfasfae');

फिर, जाँच करने के लिए:

test=# select * from fred;

 mary | jimmy |      paulie      
------+-------+------------------
    2 |    43 | asfasfasfd
    3 |   435 | ererere
    6 | 43343 | eresdfssfsfasfae

तब मैंने यह आदेश जारी किया

test=# COPY (SELECT ROW_TO_JSON(t) 
test(# FROM (SELECT * FROM fred) t) 
test-# TO '/paulstuff/sware/db/postgres/inst/myfile';
COPY 3
test=# 

मैंने तब psql छोड़ दिया और फ़ाइल myfile सूचीबद्ध की।

test=# \q
[pol@polhost inst]$ more myfile 
{"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
{"mary":3,"jimmy":435,"paulie":"ererere"}
{"mary":6,"jimmy":43343,"paulie":"eresdfssfsfasfae"}
[pol@polhost inst]$

(आप आउटपुट से प्रयोग कर सकते हैं

COPY (SELECT ROW_TO_JSON(t, TRUE)  -- <-- Note addition of "TRUE" here!

अपने फ़ुर्सत के समय में)।

@ Offby1 द्वारा बताया गया कि आउटपुट (ओपी के प्रश्न के अनुरूप) सही नहीं है JSON। @EvanCarroll ने बताया कि \oयह फ़ाइल में आउटपुट करने का एक तरीका भी है, इसलिए मैंने इस कथन में इन दो निगल्स के समाधानों को संयुक्त किया ( यहाँ से मदद के साथ ):

test=# \o out.json
test=# SELECT array_to_json(array_agg(fred), FALSE) AS ok_json FROM fred;
                                     -- <-- "TRUE" here will produce plus
                                        ("+) signs in the output. "FALSE"
                                        is the default anyway.
test=# \o

देता है:

[pol@polhost inst]$ more out.json 
                                                                   ok_json                                                                    
----------------------------------------------------------------------------------------------------------------------------------------------
 [{"mary":2,"jimmy":43,"paulie":"asfasfasfd"},{"mary":3,"jimmy":435,"paulie":"ererere"},{"mary":6,"jimmy":43343,"paulie":"eresdfssfsfasfae"}]
(1 row)
[pol@polhost inst]$ 

अंत में , वहाँ बैकस्लैश (है \) अपनी पोस्ट में @AdamGent द्वारा उल्लेख समस्या। इसमें कुछ समय मुश्किल था, लेकिन यह है के बाद क्वेरी प्रोसेसिंग का सहारा के बिना संभव। Voilà:

INSERT INTO fred VALUES (35, 5, 'wrew\sdfsd');
INSERT INTO fred VALUES (3, 44545, '\sdfs\\\sfs\\gf');

और इस प्रकार REGEXP_REPLACE का उपयोग करते हुए (कलाकारों को ध्यान दें: TEXT) अतिरिक्त ब्लैकस्लैश को हटा देता है।

test=# \o slash.json
test=# SELECT REGEXP_REPLACE(ROW_TO_JSON(t)::TEXT, '\\\\', '\\', 'g') 
test=# FROM (SELECT * FROM fred) AS t;  -- I found that using a CTE was helpful for legibility
test=# \o
test=# \q

देता है:

[pol@polhost inst]$ more slash.json 
                    regexp_replace                    
------------------------------------------------------
 {"mary":2,"jimmy":43,"paulie":"asfasfasfd"}
 {"mary":3,"jimmy":435,"paulie":"ererere"}
 {"mary":6,"jimmy":43343,"paulie":"eresdfssfsfasfae"}
 {"mary":35,"jimmy":5,"paulie":"wrew\sdfsd"}
 {"mary":3,"jimmy":44545,"paulie":"\sdfs\\\sfs\\gf"}
(5 rows)
[pol@polhost inst]$ 

(Ps @ @ Zoltán की टिप्पणी के लिए - यह एक संस्करण की बात हो सकती है - पुन: पेश करने में असमर्थ!)।


2
यह वही लगता है जो मूल पोस्टर चाहता था। ध्यान दें, हालांकि, जबकि प्रत्येक पंक्ति उचित JSON है, पंक्तियों का संग्रह नहीं है, क्योंकि इसमें पंक्तियों को अलग करने वाले अल्पविरामों का अभाव है, और उनके चारों ओर वर्ग कोष्ठक हैं।
offby1

3
यदि आपके कॉलम में कोई भी नहीं है तो यह काम नहीं करेगा backslash!!!! COPY doc को ध्यान से पढ़ें क्योंकि यह backslashपात्रों के लिए विशेष काम करता है (जैसे एक और बैकस्लैश जोड़ना)।
एडम जेंट

READ @AdamGent के बैकस्लैश मुद्दे को हल करने के लिए नीचे दिए गए उत्तर
फेसप्लम

1
तो ... वर्ष 2017 और सीओपी कमांड पोस्टग्रेक्यूएल के साथ JSON को निर्यात करने के लिए कोई रास्ता नहीं है ?? CSV विकल्प, TXT विकल्प हैं ... JSON विकल्प क्यों नहीं?
पीटर क्रूस

1
धन्यवाद @ Vérace और क्षमा करें, अब मैंने जटिल JSONb के साथ एक COPY का परीक्षण किया और संसाधित JSON ठीक था, "उचित JSON"!
पीटर क्रूस

13

यदि आप उपयोग कर रहे हैं psqlतो उपयोग करने का कोई कारण नहीं है \COPY

\t
\a
\o file.json
SELECT row_to_json(r) FROM my_table AS r;

यह वही तरीका है जो हम त्वरित परीक्षण के लिए PostGIS के साथ डेटाबेस से png / jpgs / tifs प्राप्त करने के लिए उपयोग करते हैं, और PostgreSQL एक्सटेंशन के साथ स्क्रिप्ट फ़ाइलों को उत्पन्न करने के लिए भी करते हैं।


महान! हमेशा की तरह COPY कमांड "सापेक्ष पथ को अनुमति नहीं देता" , psql-native- कमांड सापेक्ष पथ में प्रतिलिपि करने का सबसे आसान तरीका है ! पुनश्च: रिश्तेदार पथ के साथ वास्तविक COPY कमांड का उपयोग करने के लिए "टर्मिनल तरीका" है, यहां देखें । psql -h remotehost -d remote_mydb -U myuser -c "COPY (SELECT '{\"x\":1,\"y\":[\"a\",2]}'::json AS r) TO STDOUT" > ./relative_path/file.csv
पीटर क्रूस

6

मेरे लिए @ Vérace के जवाब स्तंभ नाम को बनाए रखने नहीं था, लेकिन सौंपा डिफ़ॉल्ट नाम ( f1, f2आदि) के बजाय। मैं JSON एक्सटेंशन के साथ PostgreSQL 9.1 का उपयोग कर रहा हूं ।

यदि आप पूरी तालिका को निर्यात करना चाहते हैं, तो एक उपश्रेणी की आवश्यकता नहीं है। इसके अलावा, यह कॉलम नामों को बनाए रखेगा। मैंने फॉलिंग क्वेरी का उपयोग किया:

COPY (SELECT row_to_json(t) FROM fred as t) to '/home/pol/Downloads/software/postgres/inst/myfile';

इसने कॉलम के नाम बनाए रखे! CREATE TABLE fred (mary INT, jimmy INT, paulie VARCHAR(20));और परिणाम: {"mary":2,"jimmy":43,"paulie":"asfasfasfd"}- फ़ील्ड नाम mary, जिमी, पॉली ... और कर रहे हैं नहीं ( f1, f2।, आदि) ...
Vérace

5

मैं Verace के उत्तर के लिए एक विशेष चेतावनी जोड़ूंगायदि आपको बैकस्लैश वर्णों के साथ पाठ कॉलम हैं, तो आपको आउटपुट JSON फ़ाइल पर पोस्ट प्रोसेसिंग करने की आवश्यकता है\ :।

अन्यथा आपको डुप्लिकेट ( \-> \\) सबसे अच्छा और पूरी तरह से अमान्य JSON पर बदतर यानी मिलेगा :

यह:

{ "f1" : "crap\""}.

हो जाता है

{ "f1" : "crap\\""}.

जो ठीक दिखता है, लेकिन पूरी तरह से अमान्य JSON है।

आप बदल सकते हैं \\में \sed साथ:

sed -i -e 's/\\\\/\\/g' PG_OUT_JSON_FILE.json

से Postgres कॉपी जहां वे दौर के बारे में यह उल्लेख:

वर्तमान में, COPY TO कभी भी एक ऑक्टल या हेक्स-डिजिट बैकस्लैश अनुक्रम का उत्सर्जन नहीं करेगा, लेकिन यह उन नियंत्रण वर्णों के लिए ऊपर सूचीबद्ध अन्य अनुक्रमों का उपयोग करता है। उपरोक्त तालिका में उल्लिखित किसी अन्य बैकस्लेस्ड चरित्र को स्वयं का प्रतिनिधित्व करने के लिए नहीं लिया जाएगा। हालाँकि, अनावश्यक रूप से बैकस्लैश जोड़ने से सावधान रहें, क्योंकि यह गलती से एंड-ऑफ़-डेटा मार्कर (।) या नल स्ट्रिंग (डिफ़ॉल्ट रूप से \ N) से मेल खाते स्ट्रिंग का उत्पादन कर सकता है। इन स्ट्रिंग्स को किसी अन्य बैकस्लैश प्रसंस्करण से पहले पहचाना जाएगा।

यह दृढ़ता से अनुशंसा की जाती है कि COPY डेटा जेनरेट करने वाले एप्लिकेशन क्रमशः डेटा की नई सीमाएँ और कैरेज़ रिटर्न को \ n और \ r अनुक्रम में परिवर्तित करते हैं। वर्तमान में एक बैकस्लैश और कैरिज रिटर्न द्वारा डेटा कैरिज रिटर्न का प्रतिनिधित्व करना और बैकस्लैश और न्यूलाइन द्वारा डेटा न्यूलाइन का प्रतिनिधित्व करना संभव है। हालाँकि, भविष्य के रिलीज़ में इन अभ्यावेदन को स्वीकार नहीं किया जा सकता है। अगर भ्रष्टाचार फ़ाइल को विभिन्न मशीनों (उदाहरण के लिए, यूनिक्स से विंडोज या इसके विपरीत) में स्थानांतरित किया जाता है, तो वे भी भ्रष्टाचार के प्रति अत्यधिक संवेदनशील हैं।

कॉपी प्रत्येक पंक्ति को यूनिक्स शैली की नई पंक्ति ("\ n") के साथ समाप्त करेगा। Microsoft Windows पर चलने वाले सर्वर इसके बजाय आउटपुट कैरिज रिटर्न / newline ("\ r \ n"), लेकिन केवल एक सर्वर फ़ाइल के लिए COPY के लिए; प्लेटफ़ॉर्म पर स्थिरता के लिए, हमेशा सर्वर प्लेटफ़ॉर्म की परवाह किए बिना "\ n" भेजता है। COPY FROM नई लाइनों, गाड़ी वापसी, या गाड़ी वापसी / newlines के साथ समाप्त होने वाली लाइनों को संभाल सकता है। अन-बैकस्लेस्ड नईलाइन या गाड़ी के रिटर्न के कारण त्रुटि के जोखिम को कम करने के लिए जो डेटा के रूप में थे, COPY FROM को शिकायत होगी कि इनपुट में लाइन एंडिंग सभी समान नहीं हैं।


मैंने उत्तर में यह निपटा दिया है - मुझे आशा है कि आप इसे संतोषजनक पाएंगे। यदि नहीं, तो मुझे बताएं।
13

1

एक सामान्य (MySQL, Postgres, SQLite ..) और मुफ्त समाधान के लिए जिसे आपको (डॉकर को छोड़कर) कोई सॉफ्टवेयर इंस्टॉल नहीं करना है, https://github.com/function61/sql2json देखें

पूर्ण प्रकटीकरण: मैंने वह सॉफ्टवेयर लिखा था।


0

यह एकमात्र तरीका है जो आउटपुट JSON (ऑब्जेक्ट्स की श्रेणी) को मान्य करता है

\t
\a
\o data.json
select json_agg(t) FROM (SELECT * from table) t;

( स्रोत )

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.