উত্তর:
আপনি কি সার্ভারে বা ক্লায়েন্টের ফলাফল ফাইল চান?
আপনি যদি আবার কিছু সহজে ব্যবহার করতে বা স্বয়ংক্রিয় করতে চান তবে আপনি পোস্টগ্র্রেস্কেলের বিল্ট ইন সিপি কমান্ডটি ব্যবহার করতে পারেন । যেমন
Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;
এই পদ্ধতির সম্পূর্ণরূপে রিমোট সার্ভারে চলে - এটি আপনার স্থানীয় পিসিতে লিখতে পারে না। এটি পোস্টগ্রিস "সুপারইউসার" (সাধারণত "রুট" নামে পরিচিত) হিসাবে চালানো দরকার কারণ পোস্টগ্রিস এটিকে সেই মেশিনের স্থানীয় ফাইল সিস্টেমের সাথে দুষ্টু কাজগুলি থামাতে পারে না।
আসলে এর অর্থ এই নয় যে আপনি একটি সুপার-ইউজার হিসাবে সংযুক্ত করা আছে, (স্বয়ংক্রিয় যে একটি ভিন্ন ধরনের একটি নিরাপত্তা ঝুঁকি হবে) কারণ আপনি ব্যবহার করতে পারেন বিকল্প একটি ফাংশন যা করতে রান যেন আপনি একটি সুপার-ইউজার ছিল ।SECURITY DEFINER
CREATE FUNCTION
গুরুত্বপূর্ণ অংশটি হ'ল আপনার ফাংশনটি অতিরিক্ত চেকগুলি সম্পাদন করার জন্য রয়েছে, কেবলমাত্র সিকিউরিটি বাই-পাস করার জন্য নয় - সুতরাং আপনি এমন একটি ফাংশন লিখতে পারেন যা আপনার প্রয়োজনীয় ডেটা রপ্তানি করে, বা আপনি এমন কিছু লিখতে পারেন যা যতক্ষণ না তারা বিভিন্ন বিকল্প গ্রহণ করতে পারে একটি কঠোর শ্বেত তালিকাতে দেখা। আপনার দুটি জিনিস পরীক্ষা করা দরকার:
GRANT
ডেটাবেজে এস দ্বারা সংজ্ঞায়িত করা হত তবে ফাংশনটি এখন সুপারভাইজার হিসাবে চলছে, সুতরাং সারণীগুলি যা সাধারণত "সীমার বাইরে" থাকবে তা পুরোপুরি অ্যাক্সেসযোগ্য হবে। আপনি সম্ভবত আপনার "ব্যবহারকারী" টেবিলের শেষে কাউকে আপনার ক্রিয়াকলাপটি করতে এবং সারি যুক্ত করতে চান না ...আমি এই পদ্ধতির প্রসারিত একটি ব্লগ পোস্ট লিখেছি , ফাংশনগুলির কয়েকটি উদাহরণ যা ফাইল এবং টেবিলগুলি কঠোর শর্ত পূরণ করে রফতানি করে (বা আমদানি করে)।
অন্য পদ্ধতিটি হ'ল ফাইলটি ক্লায়েন্টের পক্ষে পরিচালনা করা , অর্থাৎ আপনার অ্যাপ্লিকেশন বা স্ক্রিপ্টে। পোস্টগ্রিস সার্ভারটি আপনার কোন ফাইলটিতে অনুলিপি করছে তা জানা দরকার নেই, এটি কেবল ডেটা ছড়িয়ে দেয় এবং ক্লায়েন্টটি এটিকে কোথাও রেখে দেয়।
এর জন্য অন্তর্নিহিত বাক্য COPY TO STDOUT
গঠনটি হ'ল কমান্ড এবং পিজিএডমিনের মতো গ্রাফিকাল সরঞ্জামগুলি এটি আপনার জন্য একটি সুন্দর সংলাপে আবদ্ধ করবে।
psql
কম্যান্ড-লাইন ক্লায়েন্ট একটি বিশেষ "মেটা-কমান্ড" বলা হয়েছে \copy
, যা "বাস্তব" সব একই বিকল্প লাগে COPY
, কিন্তু ক্লায়েন্ট ভিতরে চালানো হয়:
\copy (Select * From foo) To '/tmp/test.csv' With CSV
নোট করুন যে কোনও টার্মিনেটিং নেই ;
, কারণ মেটা-কমান্ডগুলি এসকিউএল কমান্ডের বিপরীতে নিউলাইন দ্বারা বন্ধ করা হয়।
ডক্স থেকে :
পিএসকিএল নির্দেশ-কপি দিয়ে কপি বিভ্রান্ত করবেন না। \ অনুলিপি এসটিডিন থেকে অনুলিপি বা স্টিডি অনুলিপি করে, এবং তারপরে পিএসকিএল ক্লায়েন্টের অ্যাক্সেসযোগ্য কোনও ফাইলে ডেটা সংগ্রহ / সঞ্চয় করে। সুতরাং, ফাইল অ্যাক্সেসযোগ্যতা এবং অ্যাক্সেসের অধিকারগুলি যখন \ অনুলিপি ব্যবহার করা হয় তখন সার্ভারের চেয়ে ক্লায়েন্টের উপর নির্ভর করে।
আপনার অ্যাপ্লিকেশন প্রোগ্রামিং ল্যাঙ্গুয়েজে ডেটা ঠেলা বা আনার পক্ষে সমর্থন থাকতে পারে তবে আপনি সাধারণত কোনও স্ট্যান্ডার্ড এসকিউএল স্টেটমেন্টের মধ্যে COPY FROM STDIN
/ ব্যবহার করতে পারবেন না TO STDOUT
, কারণ ইনপুট / আউটপুট স্ট্রিমের সংযোগ করার কোনও উপায় নেই। পিএইচপি'র পোস্টগ্রিসএসকিউএল হ্যান্ডলার ( পিডিও নয় ) খুব বেসিক pg_copy_from
এবং pg_copy_to
ফাংশনগুলি অন্তর্ভুক্ত করে যা কোনও পিএইচপি অ্যারেতে / থেকে অনুলিপি করে যা বড় ডেটা সেটগুলির জন্য কার্যকর নাও হতে পারে।
\copy
কাজ করে - সেখানেও, পথগুলি ক্লায়েন্টের সাথে সম্পর্কিত এবং কোনও সেমিকোলনের প্রয়োজন / অনুমতি নেই। আমার সম্পাদনা দেখুন।
\copy
ওয়ান-লাইনার হওয়া দরকার। সুতরাং আপনি যেভাবে চান সিক্যুয়াল ফর্ম্যাট করার সৌন্দর্য পাবেন না এবং এর চারপাশে কেবল একটি অনুলিপি / ফাংশন রাখবেন।
\copy
একটি বিশেষ মেটা-কমান্ড মধ্যে psql
কম্যান্ড-লাইন ক্লায়েন্ট । এটি অন্যান্য ক্লায়েন্ট, পিজএডমিনের মতো কাজ করবে না; এই কাজটি করার জন্য তাদের সম্ভবত গ্রাফিকাল উইজার্ডগুলির মতো নিজস্ব সরঞ্জাম থাকবে।
বেশ কয়েকটি সমাধান রয়েছে:
psql
কমান্ডpsql -d dbname -t -A -F"," -c "select * from users" > output.csv
এতে এসএসএইচ এর মাধ্যমে আপনি এটি ব্যবহার করতে পারবেন এমন বড় সুবিধা রয়েছে ssh postgres@host command
- যেমন আপনাকে পেতে সক্ষম করে
copy
কমান্ডCOPY (SELECT * from users) To '/tmp/output.csv' With CSV;
>psql dbname
psql>\f ','
psql>\a
psql>\o '/tmp/output.csv'
psql>SELECT * from users;
psql>\q
এগুলির সবগুলি স্ক্রিপ্টগুলিতে ব্যবহার করা যেতে পারে তবে আমি # 1 পছন্দ করি।
টার্মিনালে সিভিএস ফাইলে সেটআপ আউটপুট (ডিবিতে সংযুক্ত থাকা অবস্থায়)
1) ক্ষেত্র পৃথককে এতে সেট করুন ','
:
\f ','
2) নির্ধারণ ছাড়াই আউটপুট বিন্যাস সেট করুন:
\a
3) কেবলমাত্র টিপলগুলি দেখান:
\t
4) আউটপুট সেট করুন:
\o '/tmp/yourOutputFile.csv'
5) আপনার ক্যোয়ারী কার্যকর করুন:
:select * from YOUR_TABLE
6) আউটপুট:
\o
তারপরে আপনি এই স্থানে আপনার সিএসভি ফাইলটি সন্ধান করতে পারবেন:
cd /tmp
scp
কমান্ডটি ব্যবহার করে এটি অনুলিপি করুন বা ন্যানো ব্যবহার করে সম্পাদনা করুন:
nano /tmp/yourOutputFile.csv
COPY
বা \copy
সঠিকভাবে হ্যান্ডেল পন্থা (ধর্মান্তরিত মান CSV বিন্যাসে সাহায্য); এই আছে?
যদি আপনি শিরোনামের পাশাপাশি একটি নির্দিষ্ট টেবিলের সমস্ত কলামে আগ্রহী হন , আপনি ব্যবহার করতে পারেন
COPY table TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
এটি তুলনায় একটি সামান্য বিট সহজ
COPY (SELECT * FROM table) TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
যা আমার জ্ঞানের সেরা হিসাবে সমান।
এই তথ্যটি সত্যিই ভালভাবে উপস্থাপিত হয় না। যেহেতু এটি দ্বিতীয়বারের জন্য আমার দরকার হয়েছিল, আমি অন্য কিছু না থাকলে নিজেকে মনে করিয়ে দেওয়ার জন্য এটি এখানে রাখব।
সত্যিই এটি করার সর্বোত্তম উপায় হ'ল COPY ... TO STDOUT
কমান্ডটি ব্যবহার করা (পোস্টগ্রাসের বাইরে সিএসভি পেতে) । যদিও আপনি এটি এখানে উত্তরগুলিতে দেখানো পদ্ধতিতে করতে চান না। কমান্ডটি ব্যবহারের সঠিক উপায় হ'ল:
COPY (select id, name from groups) TO STDOUT WITH CSV HEADER
এটি ssh ওভার ব্যবহারের জন্য দুর্দান্ত:
$ ssh psqlserver.example.com 'psql -d mydb "COPY (select id, name from groups) TO STDOUT WITH CSV HEADER"' > groups.csv
এটি ssh ওভার ডকারের ভিতরে ব্যবহারের জন্য দুর্দান্ত:
$ ssh pgserver.example.com 'docker exec -tu postgres postgres psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
এটি স্থানীয় মেশিনেও দুর্দান্ত:
$ psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
বা লোকাল মেশিনে ডকারের ভিতরে ?:
docker exec -tu postgres postgres psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
বা এইচটিটিপিএসের উপর দিয়ে একটি ডাবরে, একটি কুবেরনেটস ক্লাস্টারে ??
kubectl exec -t postgres-2592991581-ws2td 'psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
এত বহুমুখী, অনেক কমা!
হ্যাঁ আমি করেছি, এখানে আমার নোটগুলি রয়েছে:
ব্যবহার /copy
কার্যকরভাবে যাই হোক না কেন সিস্টেমে ফাইল অপারেশন executes psql
, কমান্ড চলছে ব্যবহারকারী কে নির্বাহ হয় 1 । আপনি যদি কোনও রিমোট সার্ভারের সাথে সংযোগ স্থাপন psql
করেন তবে রিমোট সার্ভারে / থেকে চালানো সিস্টেমে ডেটা ফাইলগুলি অনুলিপি করা সহজ ।
COPY
ব্যাকএন্ড প্রক্রিয়া ব্যবহারকারী অ্যাকাউন্ট (ডিফল্ট postgres
) হিসাবে ফাইল সার্ভারে ফাইল অপারেশনগুলি চালায় , ফাইলের পাথ এবং অনুমতিগুলি ততক্ষণে পরীক্ষা করা হয় এবং প্রয়োগ করা হয়। যদি ব্যবহার করে থাকেন TO STDOUT
তবে ফাইল অনুমতি চেকগুলি বাইপাস করা হয়।
psql
আপনি যে ফলাফলের সিএসভি চূড়ান্তভাবে বাস করতে চান সেই সিস্টেমে যদি না চালানো হয় তবে এই দুটি বিকল্পেরই পরবর্তী ফাইল চলাচলের প্রয়োজন । আপনি সম্ভবত বেশিরভাগ দূরবর্তী সার্ভারের সাথে কাজ করার সময়, আমার অভিজ্ঞতার ক্ষেত্রে এটি সম্ভবত সবচেয়ে সম্ভাব্য কেস।
টিএসসিপি / আইপি টানেলের মতো কোনও জিনিসকে সিএসভি আউটপুটের জন্য রিমোট সিস্টেমে টিএসসিপি / আইপি টানেলের মতো কনফিগার করা আরও জটিল, তবে অন্য আউটপুট ফর্ম্যাটগুলির (বাইনারি) জন্য /copy
কোনও স্থানীয়কে কার্যকর করে টানেলযুক্ত সংযোগ স্থাপন করা ভাল psql
। অনুরূপ শিরাতে, বড় আমদানির জন্য, উত্স ফাইলটি সার্ভারে সরানো এবং ব্যবহার COPY
করা সম্ভবত সর্বাধিক-সম্পাদন বিকল্প।
পিএসকিএল প্যারামিটারের সাহায্যে আপনি সিএসভি এর মতো আউটপুট ফর্ম্যাট করতে পারেন তবে পেসার অক্ষম করতে এবং হেডার না পাওয়ার মতো ডাউনসাইড রয়েছে:
$ psql -P pager=off -d mydb -t -A -F',' -c 'select * from groups;'
2,Technician,Test 2,,,t,,0,,
3,Truck,1,2017-10-02,,t,,0,,
4,Truck,2,2017-10-02,,t,,0,,
না, আমি কেবল কোনও সংকলন এবং / অথবা কোনও সরঞ্জাম ইনস্টল না করে আমার সার্ভার থেকে সিএসভি পেতে চাই।
psql
আপনার জন্য এটি করতে পারেন:
edd@ron:~$ psql -d beancounter -t -A -F"," \
-c "select date, symbol, day_close " \
"from stockprices where symbol like 'I%' " \
"and date >= '2009-10-02'"
2009-10-02,IBM,119.02
2009-10-02,IEF,92.77
2009-10-02,IEV,37.05
2009-10-02,IJH,66.18
2009-10-02,IJR,50.33
2009-10-02,ILF,42.24
2009-10-02,INTC,18.97
2009-10-02,IP,21.39
edd@ron:~$
man psql
এখানে ব্যবহৃত বিকল্পগুলির সাহায্যের জন্য দেখুন ।
নতুন সংস্করণ - PSQL 12 - সমর্থন করবে --csv
।
--csv
সিএসভি (কমা-বিভাজিত মান) আউটপুট মোডে স্যুইচ করে। এটি \ pset ফর্ম্যাট সিএসভির সমতুল্য ।
csv_fieldsep
সিএসভি আউটপুট ফর্ম্যাটে ব্যবহারের জন্য ফিল্ড বিভাজক নির্দিষ্ট করে। বিভাজক চরিত্রটি যদি কোনও ক্ষেত্রের মানতে উপস্থিত হয়, তবে সেই ক্ষেত্রটি স্ট্যান্ডার্ড সিএসভি বিধি অনুসরণ করে ডাবল উদ্ধৃতিগুলির মধ্যে আউটপুট। ডিফল্ট একটি কমা হয়।
ব্যবহার:
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv postgres
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv -P csv_fieldsep='^' postgres
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv postgres > output.csv
PgAdmin III এ ক্যোয়ারী উইন্ডো থেকে ফাইলটিতে রফতানি করার বিকল্প রয়েছে। মূল মেনুতে এটি ক্যোয়ারী -> ফাইল করতে এক্সিকিউট করুন বা একটি বোতাম আছে যা একই কাজ করে (এটি একটি নীল ফ্লপি ডিস্কের সাথে একটি সবুজ ত্রিভুজ যা সরল সবুজ ত্রিভুজটির বিপরীতে রয়েছে যা কেবল অনুসন্ধান করে) runs আপনি যদি ক্যোয়ারী উইন্ডো থেকে কোয়েরিটি চালাচ্ছেন না তবে আমি আইএমএসওপি যা বলেছিলাম তা করব এবং অনুলিপি কমান্ডটি ব্যবহার করব।
আমি একটি ছোট্ট টুল লিখেছি psql2csv
যা এই COPY query TO STDOUT
প্যাটার্নটি encapsulates , যার ফলে যথাযথ CSV হয়। এটি ইন্টারফেস অনুরূপ psql
।
psql2csv [OPTIONS] < QUERY
psql2csv [OPTIONS] QUERY
কোয়েরিটি উপস্থিত থাকলে, বা শেষ আর্গুমেন্টটি STDIN এর বিষয়বস্তু হিসাবে ধরে নেওয়া হয়। এগুলি ব্যতীত অন্য সমস্ত যুক্তিগুলি পিএসকিএলে ফরোয়ার্ড করা হয়েছে:
-h, --help show help, then exit
--encoding=ENCODING use a different encoding than UTF8 (Excel likes LATIN1)
--no-header do not output a header
আপনার যদি দীর্ঘ প্রশ্ন থাকে এবং আপনি পিএসকিএল ব্যবহার করতে চান তবে আপনার ক্যোয়ারীটি একটি ফাইলে রাখুন এবং নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
psql -d my_db_name -t -A -F";" -f input-file.sql -o output-file.csv
-F","
পরিবর্তে ব্যবহার -F";"
করতে হয়েছিল
আমি জেটব্রেইনস দ্বারা ডেটাবেস আইডিই ডেটাগ্রিপকে অত্যন্ত সুপারিশ করব। আপনি একটি সিএসভি ফাইলে একটি এসকিউএল কোয়েরি রফতানি করতে পারেন পারেন এবং সহজেই এসএসএল টানেলিং সেটআপ করতে পারেন। যখন ডকুমেন্টেশনটি "ফলাফল সেট" বোঝায়, তাদের অর্থ কনসোলে একটি এসকিউএল কোয়েরি দ্বারা প্রাপ্ত ফলাফল।
আমি ডেটাগ্রিপের সাথে যুক্ত নই, আমি কেবল পণ্যটি পছন্দ করি!
আপনার ওয়েব ব্রাউজারে একটি ডাটাবেস ক্লায়েন্ট জ্যাকডিবি এটি সত্যই সহজ করে তুলেছে । বিশেষত যদি আপনি হেরোকুতে থাকেন।
এটি আপনাকে দূরবর্তী ডেটাবেসগুলিতে সংযুক্ত করতে এবং সেগুলিতে এসকিউএল কোয়েরি চালাতে দেয়।
উত্স
(উত্স: jackdb.com )
একবার আপনার ডিবি সংযুক্ত হয়ে গেলে আপনি একটি ক্যোয়ারী চালিয়ে সিএসভি বা টিএক্সটি রপ্তানি করতে পারেন (নীচের ডানদিকে দেখুন)।
দ্রষ্টব্য: আমি কোনওভাবেই জ্যাকডিবি'র সাথে অনুমোদিত নই। আমি বর্তমানে তাদের নিখরচায় পরিষেবাগুলি ব্যবহার করি এবং মনে করি এটি দুর্দান্ত পণ্য।
@ স্কেলার ৮৮ এর অনুরোধ অনুসারে, আমি আমার মন্তব্যটি একটি উত্তর হিসাবে পুনরায় পোস্ট করছি যাতে এটি যে সমস্ত প্রতিক্রিয়া পড়ে না তাদের দ্বারা এটি হারাতে না পারে ...
ডেটাগ্রিপে সমস্যাটি হ'ল এটি আপনার মানিব্যাগের উপর একটি খপ্পর রাখে। এটি নিখরচায় নয়। Dbeaver.io এ ডিবিভারের সম্প্রদায় সংস্করণটি ব্যবহার করে দেখুন। এটি এসকিউএল প্রোগ্রামারস, ডিবিএ এবং বিশ্লেষকদের জন্য একটি ফসএস মাল্টি-প্ল্যাটফর্ম ডাটাবেস সরঞ্জাম যা সমস্ত জনপ্রিয় ডাটাবেসগুলিকে সমর্থন করে: মাইএসকিউএল, পোস্টগ্রিসকিউএল, এসকিউএলাইট, ওরাকল, ডিবি 2, এসকিউএল সার্ভার, সিবাস, এমএস অ্যাকসেস, টেরাদাতা, ফায়ারবার্ড, হাইভ, প্রেস্টো ইত্যাদি supports
ডিবিভার সম্প্রদায় সংস্করণটি একটি ডাটাবেসের সাথে সংযোগ স্থাপন, ডেটা পুনরুদ্ধার করতে কোয়েরি প্রদান এবং তারপরে সিএসভি, জেএসএন, এসকিউএল বা অন্যান্য সাধারণ ডেটা ফর্ম্যাটে সংরক্ষণের জন্য ফলাফল সেটটি ডাউনলোড করা তুচ্ছ করে তোলে। এটি পোস্টগ্রিসের জন্য টড, এসকিউএল সার্ভারের জন্য টয়ড, বা ওরাকলের জন্য টডের একটি কার্যকর টানা FOSS প্রতিযোগী।
ডিবিভারের সাথে আমার কোনও সম্পর্ক নেই। আমি দাম এবং কার্যকারিতা পছন্দ করি, তবে আমি আশা করি তারা ডিবিভার / এক্সলিপস অ্যাপ্লিকেশনটি আরও খুলবে এবং ব্যবহারকারীদের বার্ষিক সাবস্ক্রিপশনের জন্য সরাসরি গ্রাফ এবং চার্ট তৈরি করার জন্য অর্থ প্রদানের পরিবর্তে ডিবিভার / অ্যাকলিপসে বিশ্লেষণের উইজেটগুলি যুক্ত করা সহজ করে তুলবে আবেদনপত্র. আমার জাভা কোডিং দক্ষতা মরিচা এবং আমি কীভাবে এক্লিপস উইজেটগুলি তৈরি করবেন তা শিখতে কয়েক সপ্তাহ লাগার মতো মনে হয় না, কেবল ডিবিভারটি ডিবিভার কমিউনিটি সংস্করণে তৃতীয় পক্ষের উইজেট যুক্ত করার ক্ষমতা অক্ষম করে দিয়েছে।
ডিবিভারের সম্প্রদায় সংস্করণে যুক্ত করতে বিশ্লেষণ উইজেট তৈরি করার পদক্ষেপগুলি সম্পর্কে কি ডিবিভার ব্যবহারকারীদের অন্তর্দৃষ্টি রয়েছে?
import json
cursor = conn.cursor()
qry = """ SELECT details FROM test_csvfile """
cursor.execute(qry)
rows = cursor.fetchall()
value = json.dumps(rows)
with open("/home/asha/Desktop/Income_output.json","w+") as f:
f.write(value)
print 'Saved to File Successfully'