জসন হিসাবে Postgres টেবিল রফতানি করুন


35

কোনও ফাইলে জগসন হিসাবে পোস্টগ্রিজ টেবিল ডেটা রফতান করার কোনও উপায় আছে? আমার আউটপুটটি লাইন লাইনের মতো হওয়া দরকার:

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

সম্পাদনা: পোস্টগ্রেস সংস্করণ: 9.3.4

উত্তর:


48

ব্যবহার করে দেখুন এখানে একটি মৌলিক ভূমিকা জন্য PostgreSQLএবং JSON

এছাড়াও, পোস্টগ্রেএসকিউএল ডকুমেন্টেশন বেশ ভাল, তাই এখানে এটি চেষ্টা করে দেখুন । পরীক্ষা করে দেখুন 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=# 

আমি তারপরে পিএসকিএল ছেড়ে দিয়ে মাইফাইল ফাইলটি তালিকাভুক্ত করেছি।

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!

তোমার অবসরে).

@ অফবি 1 দ্বারা এটি চিহ্নিত করা হয়েছিল যে আউটপুট (ওপি-র প্রশ্নের সাথে মিল রেখে) সঠিক নয় JSON। @ ইভানকারল উল্লেখ করেছেন যে \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 দ্বারা উল্লিখিত সমস্যা। এটি কিছুক্ষণ চতুর ছিল, কিন্তু এটি হল পোস্ট-ক্যোয়ারী প্রক্রিয়াকরণ অবলম্বন না সম্ভব। ভিওলা:

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

আর এভাবে REGEXP_REPLACE ব্যবহার করা (noteালাই নোট করুন :: 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]$ 

(@ @ জোল্টনের মন্তব্য হিসাবে - এটি একটি সংস্করণ হতে পারে - পুনরুত্পাদন করতে অক্ষম!)।


2
মূল পোস্টারটি যা চেয়েছিল তা হ'ল মনে হচ্ছে। তবে নোট করুন, যদিও প্রতিটি সারিটি যথাযথ জেএসএন রয়েছে, সারিগুলির সংগ্রহটি হ'ল না, কারণ এতে সারিগুলিকে আলাদা করার মতো কমা এবং চারপাশে বর্গাকার বন্ধনী নেই।
অফবি 1

3
আপনার কলামগুলিতে কোনও থাকলে এটি কাজ করবে নাbackslash !!!! কপির ডকটি সাবধানে পড়ুন কারণ এটি backslashঅক্ষরের জন্য বিশেষ কিছু করে (যেমন অন্য ব্যাকস্ল্যাশ যুক্ত করা)।
অ্যাডাম জেন্ট

ব্যাকস্ল্যাশ ইস্যু সমাধান করার জন্য নীচে @ অ্যাডামজেন্টের উত্তর পড়ুন
ফেসপম

1
সুতরাং ... বছর 2017 এবং না করে উপায় রপ্তানি করুন তাদেরকে JSON অনুলিপি কমান্ড পোস্টগ্রি সঙ্গে ?? সিএসভি বিকল্প আছে, টিএক্সটি বিকল্প আছে ... কেন জেএসএন বিকল্প নয়?
পিটার ক্রাউস

1
ধন্যবাদ @ ভ্যুরেস এবং দুঃখিত, আমি এখন জটিল JSONb এর সাথে একটি কপি পরীক্ষা করেছি এবং পদ্ধতিযুক্ত JSON ভাল ছিল, "যথাযথ JSON"!
পিটার ক্রাউস

13

আপনি যদি ব্যবহার করছেন psqlতবে এগুলি ব্যবহার করার কোনও কারণ নেই \COPY

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

দ্রুত পরীক্ষার জন্য পোস্টজিআইএসের সাথে ডাটাবেস থেকে পিএনজি / জেপিএস / টিফস পেতে এবং পোস্টগ্রাইএসকিউএল এক্সটেনশনের সাহায্যে স্ক্রিপ্ট ফাইল উত্পন্ন করার জন্য আমরা একই পদ্ধতি ব্যবহার করি।


গ্রেট! যথারীতি COPY কমান্ড "আপেক্ষিক পাথের অনুমতি দেয় না" , psql-Native- কমান্ডগুলি আপেক্ষিক পথে অনুলিপি করার সহজতম উপায় ! PS: আপেক্ষিক পথের সাথে সত্যিকারের কপি কমান্ডটি ব্যবহার করার জন্য একটি "টার্মিনাল উপায়" রয়েছে, এখানে দেখুন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"}- ফিল্ডের নাম মেরি, জিমি, পলি ... এবং হয় না ( f1, f2।, ইত্যাদি) ...
Vérace

5

আমি ভেরাসের উত্তরে একটি বিশেষ ক্যাভিয়েট যুক্ত করব । আপনার যদি ব্যাকস্ল্যাশ অক্ষর সহ পাঠ্য কলাম থাকে: আউটপুটযুক্ত JSON ফাইলটিতে আপনার পোস্ট প্রসেসিং করা দরকার\

অন্যথায় আপনি অনুলিপি ( \-> \\) সেরা এবং সম্পূর্ণরূপে অবৈধ জেএসএন এর চেয়ে খারাপ হিসাবে পাবেন:

এই:

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

হয়ে

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

যা দেখতে দুর্দান্ত তবে সম্পূর্ণ অবৈধ জেএসওএন।

আপনি প্রতিস্থাপন করতে পারেন \\মধ্যে \sed সঙ্গে

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

পোস্টগ্রিস কপি থেকে যেখানে তারা এটির উল্লেখ করে:

বর্তমানে, কপি টু কখনই অষ্টাল বা হেক্স ডিজিটের ব্যাকস্ল্যাশ সিকোয়েন্সকে ছাড়বে না তবে এটি নিয়ন্ত্রণ অক্ষরের জন্য উপরে তালিকাভুক্ত অন্যান্য সিকোয়েন্সগুলি ব্যবহার করে। উপরের টেবিলটিতে উল্লিখিত না হওয়া অন্য কোনও ব্যাকস্ল্যাশড চরিত্রটি নিজেকে উপস্থাপন করার জন্য নেওয়া হবে। তবে অযথা ব্যাকস্ল্যাশ যোগ করার বিষয়ে সতর্ক থাকুন, কারণ এটি ঘটনাক্রমে ডেটা-এর শেষের চিহ্ন (।) বা নাল স্ট্রিং (ডিফল্টরূপে \ N) এর সাথে মিলে একটি স্ট্রিং তৈরি করতে পারে। অন্য কোনও ব্যাকস্ল্যাশ প্রসেসিংয়ের আগে এই স্ট্রিংগুলি স্বীকৃত হবে।

এটি দৃ strongly়ভাবে সুপারিশ করা হয় যে COPY ডেটা উৎপন্নকারী অ্যাপ্লিকেশনগুলি ডেটা নিউলাইন এবং ক্যারিজ যথাক্রমে \ n এবং \ r ক্রমগুলিতে রূপান্তর করে। বর্তমানে ব্যাকস্ল্যাশ এবং ক্যারেজ রিটার্ন দ্বারা ডেটা ক্য্যারিজ রিটার্ন উপস্থাপন করা এবং ব্যাকস্ল্যাশ এবং নিউলাইন দ্বারা ডেটা নিউলাইন প্রতিনিধিত্ব করা সম্ভব। তবে ভবিষ্যতে প্রকাশে এই উপস্থাপনাগুলি গ্রহণযোগ্য নাও হতে পারে। তারা যদি সিপিপি ফাইলটি বিভিন্ন মেশিনে স্থানান্তরিত করে (উদাহরণস্বরূপ, ইউনিক্স থেকে উইন্ডোজ বা তদ্বিপরীত) দুর্নীতির পক্ষেও চুমুকের মধ্যে রয়েছে।

প্রতিলিপি প্রতিলিপি ইউনিক্স-স্টাইলের নতুন লাইনের ("\ n") দিয়ে শেষ করবে termin মাইক্রোসফ্ট উইন্ডোজে চলমান সার্ভারগুলি পরিবর্তে আউটপুট ক্যারেজ রিটার্ন / নিউলাইন ("\ r \ n"), তবে কেবল একটি সার্ভার ফাইলে কপির জন্য; প্ল্যাটফর্মগুলি জুড়ে ধারাবাহিকতার জন্য, সর্বদা অনুলিপি করুন সার্ভার প্ল্যাটফর্ম নির্বিশেষে "\ n" প্রেরণ করে। কপির থেকে কপি নিউলাইনস, ক্যারেজ রিটার্ন, বা ক্যারেজ রিটার্ন / নিউলাইনগুলির সাথে শেষ হওয়া লাইনগুলি পরিচালনা করতে পারে। আন-ব্যাকস্ল্যাশড নিউলাইনগুলি বা ক্যারেজ রিটার্নগুলির কারণে ত্রুটির ঝুঁকি হ্রাস করার জন্য যা ডেটা হিসাবে বোঝানো হয়েছিল, ইনপুটটির লাইন শেষগুলি সমস্ত একসাথে না থাকলে কপির পক্ষ থেকে অভিযোগ করবে।


আমি উত্তরে এটির সাথে মোকাবিলা করেছি - আশা করি আপনি এটি সন্তোষজনক বলে মনে করেন। যদি না হয়, আমাকে জানাবেন।
ভোরেস

1

জেনেরিক (মাইএসকিউএল, পোস্টগ্রিস, এসকিউএলাইট ..) এবং বিনামূল্যে সমাধানের জন্য আপনাকে (ডকার ব্যতীত) কোনও সফ্টওয়্যার ইনস্টল করতে হবে না, দেখুন https://github.com/function61/sql2json

সম্পূর্ণ প্রকাশ: আমি সেই সফটওয়্যারটি লিখেছি।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.