जवाबों:
करने के लिए एक बुनियादी परिचय के लिए यहाँ और प्रयास करें ।PostgreSQL
JSON
इसके अलावा, 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 की टिप्पणी के लिए - यह एक संस्करण की बात हो सकती है - पुन: पेश करने में असमर्थ!)।
backslash
!!!! COPY doc को ध्यान से पढ़ें क्योंकि यह backslash
पात्रों के लिए विशेष काम करता है (जैसे एक और बैकस्लैश जोड़ना)।
यदि आप उपयोग कर रहे हैं psql
तो उपयोग करने का कोई कारण नहीं है \COPY
।
\t
\a
\o file.json
SELECT row_to_json(r) FROM my_table AS r;
यह वही तरीका है जो हम त्वरित परीक्षण के लिए PostGIS के साथ डेटाबेस से png / jpgs / tifs प्राप्त करने के लिए उपयोग करते हैं, और PostgreSQL एक्सटेंशन के साथ स्क्रिप्ट फ़ाइलों को उत्पन्न करने के लिए भी करते हैं।
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
मेरे लिए @ 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
।, आदि) ...
मैं 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 को शिकायत होगी कि इनपुट में लाइन एंडिंग सभी समान नहीं हैं।
एक सामान्य (MySQL, Postgres, SQLite ..) और मुफ्त समाधान के लिए जिसे आपको (डॉकर को छोड़कर) कोई सॉफ्टवेयर इंस्टॉल नहीं करना है, https://github.com/function61/sql2json देखें
पूर्ण प्रकटीकरण: मैंने वह सॉफ्टवेयर लिखा था।