উত্তর:
ব্যবহার করে দেখুন এখানে একটি মৌলিক ভূমিকা জন্য 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]$
(@ @ জোল্টনের মন্তব্য হিসাবে - এটি একটি সংস্করণ হতে পারে - পুনরুত্পাদন করতে অক্ষম!)।
backslash
!!!! কপির ডকটি সাবধানে পড়ুন কারণ এটি backslash
অক্ষরের জন্য বিশেষ কিছু করে (যেমন অন্য ব্যাকস্ল্যাশ যুক্ত করা)।
আপনি যদি ব্যবহার করছেন psql
তবে এগুলি ব্যবহার করার কোনও কারণ নেই \COPY
।
\t
\a
\o file.json
SELECT row_to_json(r) FROM my_table AS r;
দ্রুত পরীক্ষার জন্য পোস্টজিআইএসের সাথে ডাটাবেস থেকে পিএনজি / জেপিএস / টিফস পেতে এবং পোস্টগ্রাইএসকিউএল এক্সটেনশনের সাহায্যে স্ক্রিপ্ট ফাইল উত্পন্ন করার জন্য আমরা একই পদ্ধতি ব্যবহার করি।
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
আমার জন্য @ 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
।, ইত্যাদি) ...
আমি ভেরাসের উত্তরে একটি বিশেষ ক্যাভিয়েট যুক্ত করব । আপনার যদি ব্যাকস্ল্যাশ অক্ষর সহ পাঠ্য কলাম থাকে: আউটপুটযুক্ত 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" প্রেরণ করে। কপির থেকে কপি নিউলাইনস, ক্যারেজ রিটার্ন, বা ক্যারেজ রিটার্ন / নিউলাইনগুলির সাথে শেষ হওয়া লাইনগুলি পরিচালনা করতে পারে। আন-ব্যাকস্ল্যাশড নিউলাইনগুলি বা ক্যারেজ রিটার্নগুলির কারণে ত্রুটির ঝুঁকি হ্রাস করার জন্য যা ডেটা হিসাবে বোঝানো হয়েছিল, ইনপুটটির লাইন শেষগুলি সমস্ত একসাথে না থাকলে কপির পক্ষ থেকে অভিযোগ করবে।
জেনেরিক (মাইএসকিউএল, পোস্টগ্রিস, এসকিউএলাইট ..) এবং বিনামূল্যে সমাধানের জন্য আপনাকে (ডকার ব্যতীত) কোনও সফ্টওয়্যার ইনস্টল করতে হবে না, দেখুন https://github.com/function61/sql2json
সম্পূর্ণ প্রকাশ: আমি সেই সফটওয়্যারটি লিখেছি।
এটিই একমাত্র পদ্ধতি যা বৈধ JSON (অবজেক্টের অ্যারে) আউটপুট দেয় ।
\t
\a
\o data.json
select json_agg(t) FROM (SELECT * from table) t;
( উত্স )