পোস্টগ্র্রেএসকিউএল টেবিল থেকে সারণি এসকিউএল স্ক্রিপ্ট হিসাবে নির্দিষ্ট সারিগুলি রফতানি করুন


196

আমার একটি ডাটাবেস স্কিমা রয়েছে: nyummyএবং একটি সারণী নামযুক্ত cimory:

create table nyummy.cimory (
  id numeric(10,0) not null,
  name character varying(60) not null,
  city character varying(50) not null,
  CONSTRAINT cimory_pkey PRIMARY KEY (id)
);

আমি cimoryটেবিলের ডেটা এসকিউএল স্ক্রিপ্ট ফাইল সন্নিবেশ হিসাবে রফতানি করতে চাই । তবে আমি কেবল রেকর্ড / ডেটা রফতানি করতে চাই যেখানে শহরটি 'টোকিও' এর সমান (শহরটির ডেটা সমস্ত ছোট হাতের ধারনা)।

এটা কিভাবে করতে হবে?

সমাধানটি ফ্রিওয়্যার জিইউআই সরঞ্জামগুলিতে বা কমান্ড লাইনে রয়েছে কিনা তা বিবেচ্য নয় (যদিও জিইউআই সরঞ্জামগুলির সমাধান আরও ভাল)। আমি পিজএডমিন তৃতীয় চেষ্টা করেছিলাম, তবে আমি এটি করার জন্য কোনও বিকল্প খুঁজে পাচ্ছি না।


2
আপনি INSERT স্টেটমেন্টগুলি এড়িয়ে যেতে পারেন এবং কেবল ডাটাবেসের মধ্যে নির্বাচন করুন নির্বাচন করুন। albertech.blogspot.com/2016/11/…
জার

PostgreSQL ডাটাবেস জুড়ে নির্বাচন করতে পারে না। কমপক্ষে, পুরানো সংস্করণগুলি গ্রিনপ্লম পারে না এবং নাও 9.x সম্পর্কে জানে না
ফিলহিবস

আমি বুঝতে পেরেছি এটি পুরানো, তবে আমি কেবল উল্লেখ করতে চেয়েছিলাম যে dblink ব্যবহার করে ডাটাবেসগুলির মধ্যে নির্বাচন করা সম্ভব , যা কমপক্ষে v8.3 থেকে পাওয়া যায়। এটি "দূরবর্তী" ডাটাবেসগুলিতে সংযোগ করতে বিদেশী সার্ভার এবং বিদেশী ডেটা র‌্যাপারগুলি ব্যবহার করে। এই ডাটাবেসগুলি একই উদাহরণে বা সম্পূর্ণ ভিন্ন হোস্টে বিদ্যমান কিনা তা কাজ করে। আমি নির্দিষ্ট তথ্য প্রতিবেদনের সুবিধার্থে অন্যান্য ডেটাবেজে বস্তুগত দৃষ্টিভঙ্গি তৈরির জন্য এটি যথেষ্ট পরিমাণে ব্যবহার করেছি এবং এটি দুর্দান্ত কাজ করে।
জি_হোসা_পথ

উত্তর:


280

আপনি যে সেটটি রফতানি করতে চান তার সাথে একটি টেবিল তৈরি করুন এবং তারপরে কোনও ফাইলে রফতানি করতে কমান্ড লাইন ইউটিলিটি ব্যবহার করুন pg_dump:

create table export_table as 
select id, name, city
from nyummy.cimory
where city = 'tokyo'
$ pg_dump --table=export_table --data-only --column-inserts my_database > data.sql

--column-inserts কলামের নাম সহ সন্নিবেশ কমান্ড হিসাবে ডাম্প হবে।

--data-only স্কিমা ডাম্প করবেন না।

নীচে মতামত হিসাবে, একটি সারণীর পরিবর্তে একটি ভিউ তৈরি করা যখনই কোনও নতুন রফতানি প্রয়োজন তখন টেবিলের সৃষ্টিকে বাধাগ্রস্থ করবে।


3
ঠিক আছে, এখনও পর্যন্ত আপনার সমাধান কাজ করে। একটি জিনিস মিস করা হয়েছে আমাকে "-U ব্যবহারকারীর নাম" যুক্ত করা দরকার। আমি প্রায় টরএসকিউএল সরঞ্জাম দিয়েও সফল হয়েছি, স্ক্রিপ্টের ফলাফলের তারিখ-সময় ডেটাতে এটির ত্রুটি রয়েছে। যদি 2 দিনের মধ্যে কেউ জিইআইআই সরঞ্জাম সমাধান দিতে না পারে তবে আপনার উত্তর গৃহীত হবে
নাল

2
কেবল অন্য লোকের সাথে ভাগ করে নিতে চাই, আপনি এই বিনামূল্যে জিইউআই সরঞ্জামটিও ব্যবহার করতে পারেন: এসকিউএল ওয়ার্কবেঞ্চ / জে (পোস্টগ্রিসএসকিউএল জেডিবিসি 4 ড্রাইভার সহ), একই জিনিসটি করতে।
নাল

1
এটি আরও ভাল হবে create view export_view..., যেহেতু বেস টেবিলের পরিবর্তনের সাথে ভিউটি আপ টু ডেট থাকবে। ডক্স বলে --table=table: Dump only tables (or **views**...তাই আমি কিছু আশা এই কাজ করবে ছিল, কিন্তু একটি দৃশ্য ডাম্পিং দুঃখিতভাবে কোন তথ্য উৎপাদ। : P: P
poshest

@ পোস্তেস্ট 9.5 এ এটি আমার জন্য কাজ করে। আপনি ঠিক কি চেষ্টা করেছেন?
ক্লোডোলোডো নেট

@ ক্লডোয়াল্ডো নেটও ওহ, ঠিক আছে দুর্দান্ত! আমি আশা করি আমি এটিও কাজ করতে পারি। আমি pg_dump --table=my_schema.my_view --data-only --inserts my_db > data.sql9.5.3 সংস্করণ ব্যবহার করেছি এবং আমার createবক্তব্যটি আপনার মত বাদে একই রকম ছিল create view...। আমি আউটপুটে যা পাই তা হ'ল সাধারণ pg_dump মন্তব্য এবং SETবিবৃতি। আমি কোথায় ভুল করছি তা নিশ্চিত নয়।
poshest

176

কেবলমাত্র একটি ডেটা রফতানি ব্যবহারের জন্য COPY
আপনি সরল পাঠ্য ( INSERTআদেশ নয় ) হিসাবে প্রতি লাইনে এক টেবিল সারি সহ একটি ফাইল পান , এটি ছোট এবং দ্রুত:

COPY (SELECT * FROM nyummy.cimory WHERE city = 'tokio') TO '/path/to/file.csv';

একই কাঠামোর অন্য একটি টেবিলের সাথে একইটিকে আমদানি করুন:

COPY other_tbl FROM '/path/to/file.csv';

COPYলিখেছেন এবং পড়া ফাইল সার্ভারে স্থানীয় মতো ক্লায়েন্ট প্রোগ্রাম অসদৃশ pg_dumpবা psqlযা পড়া এবং লেখার ফাইল ক্লায়েন্ট স্থানীয় । যদি উভয়ই একই মেশিনে চালিত হয় তবে এটি খুব বেশি গুরুত্ব দেয় না, তবে এটি দূরবর্তী সংযোগগুলির জন্য করে।

রয়েছে \copypsql নির্দেশে যে:

ফ্রন্টএন্ড (ক্লায়েন্ট) অনুলিপি সম্পাদন করে। এটি একটি অপারেশন যা একটি এসকিউএল COPYকমান্ড চালায় , তবে সার্ভারটি নির্দিষ্ট ফাইলটি পড়া বা লেখার পরিবর্তে, পিএসএইচএল ফাইলটি পড়তে বা লিখতে দেয় এবং সার্ভার এবং স্থানীয় ফাইল সিস্টেমের মধ্যে ডেটা রুট করে। এর অর্থ ফাইলের অ্যাক্সেসযোগ্যতা এবং সুবিধাগুলি হ'ল স্থানীয় ব্যবহারকারীর, এটি সার্ভার নয় এবং কোনও এসকিউএল সুপারভাইজার সুবিধার দরকার নেই।


10
স্কেল স্ক্রিপ্ট ফাইল সন্নিবেশ করানোর জন্য ওপি বিশেষত ডেটার জন্য কল করে । আমার ধারণা তিনি insertআদেশের কথা বলছেন , তাই না?
ক্লোডোয়াল্ডো নেটো

1
@ ক্লডোয়াল্ডো: আপনি ঠিকই থাকতে পারেন, এক্ষেত্রে আপনার উত্তরটি আরও ভাল ফিট হতে পারে। একজন পৃথকভাবে পিজএডমিনে ক্রিট স্ক্রিপ্টটি অনুলিপি করতে পারে (যেমন ওপি জিওআইআইএস উল্লেখ করে)।
এরউইন ব্র্যান্ডস্টেটার

3
STDINএবং STDOUTফাইল পাথের জায়গায় ব্যবহার করা যেতে পারে, যা ছোট ডেটা রফতানির জন্য দরকারী।
আমির আলী আকবরী

1
ছাড়া--column-inserts পতাকা, pg_dump একটি ব্যবহার COPYSQL কোড তা উত্পন্ন মধ্যে টেবিল প্রত্যেকের জন্য stdin থেকে।
র্যান্ডল

2
লক্ষ্য করুন যে আপনি যে কলামগুলির নির্বাচন করুন তার ক্রমটি গন্তব্য ডাটাবেসে কলামগুলির ক্রমের সাথে মেলে। যদি এটি না হয় তবে এটি ব্যর্থ হতে পারে বা আরও খারাপ হতে পারে তবে সফল হতে পারে তবে খারাপ ডেটা .োকাতে পারে।
নাথান ওয়ালেস

32

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

  1. টার্গেট টেবিলে ডান ক্লিক করুন এবং "ব্যাকআপ" নির্বাচন করুন।
  2. ব্যাকআপ সংরক্ষণের জন্য একটি ফাইলের পথ নির্বাচন করুন। ফর্ম্যাট হিসাবে "সমতল" নির্বাচন করুন।
  3. নীচে "ডাম্প অপশন # 2" ট্যাবটি খুলুন এবং "কলাম সন্নিবেশ ব্যবহার করুন" চেক করুন।
  4. ব্যাকআপ-বোতামটি ক্লিক করুন।
  5. যদি আপনি ফলাফলটি কোনও পাঠ্য পাঠকের (যেমন নোটপ্যাড ++) দিয়ে খুলেন তবে আপনি পুরো টেবিলটি তৈরি করতে একটি স্ক্রিপ্ট পাবেন। সেখান থেকে আপনি কেবল উত্পন্ন ইনসার্ট-বিবৃতি অনুলিপি করতে পারেন।

এই পদ্ধতিটি @ ক্লডোয়াল্ডো নেটোর উত্তরটিতে প্রদর্শিত হিসাবে এক্সপোর্ট_সামগ্রী তৈরির কৌশল নিয়েও কাজ করে।

লক্ষ্য টেবিলের ডানদিকে ক্লিক করুন এবং "ব্যাকআপ" চয়ন করুন

একটি গন্তব্য পথ বেছে নিন এবং ফর্ম্যাটটিকে "সমতল" এ পরিবর্তন করুন

নীচে "ডাম্প বিকল্প # 2" ট্যাবটি খুলুন এবং "কলাম সন্নিবেশ ব্যবহার করুন" পরীক্ষা করুন

আপনি সেখান থেকে INSERT বিবৃতি অনুলিপি করতে পারেন।


আমি যখন এটি করি তখন কোনও "বকআপ" বিকল্প নেই। এটি পিজএডমিন III v1.18.1 গ্রিনপ্লাম 4.3.4.1 এর সাথে সংযুক্ত হচ্ছে (পোস্টগ্রিসকিউএল 8.2.15 এর উপর ভিত্তি করে)।
ফিলহিবস

আমি pgAdmin তৃতীয় v1.18.1 ইনস্টল এবং সেখানে ছিল "ব্যাকআপ" বিকল্পটি। আমি একটি পোস্টগ্র্যাসকিউএল 9.5 এর সাথে সংযুক্ত করেছি। সুতরাং সমস্যাটি সম্ভবত পিজিএডমিন এবং গ্রিনপ্লামের মধ্যে।
Andi আর

পিজিএডমিন 4
নিখিল

9

এসকিউএল ওয়ার্কবেঞ্চের এমন বৈশিষ্ট্য রয়েছে।

কোনও ক্যোয়ারী চালানোর পরে, ক্যোয়ারির ফলাফলগুলিতে ডান ক্লিক করুন এবং "এসকিউএল হিসাবে ডেটা অনুলিপি করুন> এসকিউএল সন্নিবেশ" নির্বাচন করুন


1
এটি দুর্দান্ত কাজ করে। আপনি যখন 'পোস্টগ্র্রেস'টিকে' ড্রাইভার 'হিসাবে বেছে নেন, সম্ভবত আপনি জেডিবিসি ড্রাইভারগুলি নিজেই ডাউনলোড করতে পারবেন: jdbc.postgresql.org/download.html (এটি একটি .jar ফাইল - জাভা বাইনারি) এবং এটি হিসাবে যুক্ত করুন পোস্টগ্র্যাস্কল সংযোগের 'ড্রাইভার'। সংযোগের স্ট্রিং (বা ইন্টারফেসের মতো ইউআরএল) এর মতো দেখতে পাওয়া উচিত: jdbc: postgresql: //127.0.0.1: 5432 / db_name
mrmuggles

ডিবিভিজুয়ালাইজারের একটি অনুরূপ এবং দুর্দান্ত বৈশিষ্ট্য রয়েছে যা কোনও ফাইল বা সরাসরি ক্লিপবোর্ডে অনুলিপি করতে পারে।
নওমেনন

8

আমার ব্যবহারের ক্ষেত্রে আমি কেবল গ্রেপ করতে পাইপ করতে সক্ষম হয়েছি।

pg_dump -U user_name --data-only --column-inserts -t nyummy.cimory | grep "tokyo" > tokyo.sql

2
অন্য ক্ষেত্রে 'টোকিও' থাকার বিষয়ে অবশ্যই বিবেচনা করা উচিত।
বাইয়াত জোোকো রিভাই

@ বুয়ুত জোকো রিওয়াই যেহেতু এটি বেশিরভাগ ক্ষেত্রে কেবল একটি টেবিলই ডাম্প হয় এটি ভাল হওয়া উচিত
ইসমাইল ইকবাল

মামলায় অন্যদের মধ্যে সবচেয়ে চতুর উপায় <3
নাম জি ভি ইউ

যদিও বড় টেবিল সহ, আপনি গ্রাপের জন্য সমস্ত সারি ছুঁড়ে ফেলবেন যা আপনার সমাধানের জন্য সমস্যার ক্ষেত্র। এর পরে, আমরা যেভাবে প্রশ্নের সাথে এবং একটি টেবিল করার জন্য দোকানের ফলাফলের এখানে ডাম্প stackoverflow.com/a/12816187/248616 আরো suiteable হয়
ভিয়েতনামে জি ভি ইউ

5

আমি বিভিন্ন পদ্ধতিতে @ ফিলহিবস কোডের উপর ভিত্তি করে এমন একটি পদ্ধতি লেখার চেষ্টা করেছি। দয়া করে দেখুন এবং পরীক্ষা করুন।

 CREATE OR REPLACE FUNCTION dump(IN p_schema text, IN p_table text, IN p_where text)
   RETURNS setof text AS
 $BODY$
 DECLARE
     dumpquery_0 text;
     dumpquery_1 text;
     selquery text;
     selvalue text;
     valrec record;
     colrec record;
 BEGIN

     -- ------ --
     -- GLOBAL --
     --   build base INSERT
     --   build SELECT array[ ... ]
     dumpquery_0 := 'INSERT INTO ' ||  quote_ident(p_schema) || '.' || quote_ident(p_table) || '(';
     selquery    := 'SELECT array[';

     <<label0>>
     FOR colrec IN SELECT table_schema, table_name, column_name, data_type
                   FROM information_schema.columns
                   WHERE table_name = p_table and table_schema = p_schema
                   ORDER BY ordinal_position
     LOOP
         dumpquery_0 := dumpquery_0 || quote_ident(colrec.column_name) || ',';
         selquery    := selquery    || 'CAST(' || quote_ident(colrec.column_name) || ' AS TEXT),';
     END LOOP label0;

     dumpquery_0 := substring(dumpquery_0 ,1,length(dumpquery_0)-1) || ')';
     dumpquery_0 := dumpquery_0 || ' VALUES (';
     selquery    := substring(selquery    ,1,length(selquery)-1)    || '] AS MYARRAY';
     selquery    := selquery    || ' FROM ' ||quote_ident(p_schema)||'.'||quote_ident(p_table);
     selquery    := selquery    || ' WHERE '||p_where;
     -- GLOBAL --
     -- ------ --

     -- ----------- --
     -- SELECT LOOP --
     --   execute SELECT built and loop on each row
     <<label1>>
     FOR valrec IN  EXECUTE  selquery
     LOOP
         dumpquery_1 := '';
         IF not found THEN
             EXIT ;
         END IF;

         -- ----------- --
         -- LOOP ARRAY (EACH FIELDS) --
         <<label2>>
         FOREACH selvalue in ARRAY valrec.MYARRAY
         LOOP
             IF selvalue IS NULL
             THEN selvalue := 'NULL';
             ELSE selvalue := quote_literal(selvalue);
             END IF;
             dumpquery_1 := dumpquery_1 || selvalue || ',';
         END LOOP label2;
         dumpquery_1 := substring(dumpquery_1 ,1,length(dumpquery_1)-1) || ');';
         -- LOOP ARRAY (EACH FIELD) --
         -- ----------- --

         -- debug: RETURN NEXT dumpquery_0 || dumpquery_1 || ' --' || selquery;
         -- debug: RETURN NEXT selquery;
         RETURN NEXT dumpquery_0 || dumpquery_1;

     END LOOP label1 ;
     -- SELECT LOOP --
     -- ----------- --

 RETURN ;
 END
 $BODY$
   LANGUAGE plpgsql VOLATILE;

এবং তারপর :

-- for a range
SELECT dump('public', 'my_table','my_id between 123456 and 123459'); 
-- for the entire table
SELECT dump('public', 'my_table','true');

মিশ্র ক্ষেত্রের ডেটাটাইপ (পাঠ্য, ডাবল, ইনট, টাইম জোন ছাড়াই টাইমস্ট্যাম্প ইত্যাদি) সহ আমার পোস্টগ্রেস 9.1 এ পরীক্ষিত।

এই কারণেই পাঠ্য ক্ষেত্রে টাইপ করা দরকার। আমার পরীক্ষাটি প্রায় 9 এম লাইনের জন্য সঠিকভাবে চালিত হয়, দেখে মনে হচ্ছে 18 মিনিটের দৌড়ানোর আগে এটি ব্যর্থ হয়।

PS: আমি WEB তে mysql এর সমতুল্য খুঁজে পেয়েছি।


3

আপনি সুনির্দিষ্ট রেকর্ডের সাহায্যে সারণীটির দৃশ্য তৈরি করতে পারেন এবং তারপরে এসকিএল ফাইলটি ফেলে দিতে পারেন

CREATE VIEW foo AS
SELECT id,name,city FROM nyummy.cimory WHERE city = 'tokyo'

3
আমি এটি pgAdmin III এ চেষ্টা করেছিলাম, তবে ভিউ অবজেক্টের জন্য, ডাম্পিংয়ের কোনও বিকল্প নেই।
নাল

নাভিচ্যাট চেষ্টা করুন। আমি এটি ব্যবহার করছি এবং এটিতে এসকিউএল স্ক্রিপ্ট রফতানি বিকল্প রয়েছে
জিয়েরগি পিকারিশ্ভিলি

@ জিওরগি: ফ্রিওয়্যার সংস্করণ আছে কি?
নাল


2

আমি এটি করার জন্য একটি দ্রুত প্রক্রিয়াটি ছুঁড়েছি। এটি কেবল একটি একক সারির জন্য কাজ করে, তাই আমি একটি অস্থায়ী দৃষ্টিভঙ্গি তৈরি করি যা কেবল আমার সারিটি নির্বাচন করে এবং তারপরে pg_temp.temp_viewটিকে আসল টেবিলের সাথে প্রতিস্থাপন করতে চাই with

CREATE OR REPLACE FUNCTION dv_util.gen_insert_statement(IN p_schema text, IN p_table text)
  RETURNS text AS
$BODY$
DECLARE
    selquery text; 
    valquery text; 
    selvalue text; 
    colvalue text; 
    colrec record;
BEGIN

    selquery := 'INSERT INTO ' ||  quote_ident(p_schema) || '.' || quote_ident(p_table);

    selquery := selquery || '(';

    valquery := ' VALUES (';
    FOR colrec IN SELECT table_schema, table_name, column_name, data_type
                  FROM information_schema.columns 
                  WHERE table_name = p_table and table_schema = p_schema 
                  ORDER BY ordinal_position 
    LOOP
      selquery := selquery || quote_ident(colrec.column_name) || ',';

      selvalue := 
        'SELECT CASE WHEN ' || quote_ident(colrec.column_name) || ' IS NULL' || 
                   ' THEN ''NULL''' || 
                   ' ELSE '''' || quote_literal('|| quote_ident(colrec.column_name) || ')::text || ''''' || 
                   ' END' || 
        ' FROM '||quote_ident(p_schema)||'.'||quote_ident(p_table);
      EXECUTE selvalue INTO colvalue;
      valquery := valquery || colvalue || ',';
    END LOOP;
    -- Replace the last , with a )
    selquery := substring(selquery,1,length(selquery)-1) || ')';
    valquery := substring(valquery,1,length(valquery)-1) || ')';

    selquery := selquery || valquery;

RETURN selquery;
END
$BODY$
  LANGUAGE plpgsql VOLATILE;

এইভাবে আহ্বান করা হয়েছে:

SELECT distinct dv_util.gen_insert_statement('pg_temp_' || sess_id::text,'my_data') 
from pg_stat_activity 
where procpid = pg_backend_pid()

আমি ইঞ্জেকশন আক্রমণগুলির বিরুদ্ধে এটি পরীক্ষা করে দেখিনি, দয়া করে আমাকে জানান দয়া করে কোট_লিটালাল কলটি পর্যাপ্ত নয়।

এছাড়াও এটি কেবলমাত্র কলামগুলির জন্য কাজ করে যা কেবলমাত্র :: পাঠ্যে এবং আবার ফিরে যেতে পারে।

এছাড়াও এটি গ্রিনপ্লমের জন্য তবে এটি পোস্টগ্র্রেস, সিএমআইআইডাব্লুতে কেন কাজ করবে না তার কোনও কারণ আমি ভাবতে পারি না।


-2

আপনি কি প্যাগাডমিন " EXECUTE QUERY WRITE RESULT TO FILE " অপশনটি দিয়ে ক্যোয়ারী কার্যকর করতে চেষ্টা করেছেন?

এটি কেবল ডেটা রফতানি করে, অন্যথায় চেষ্টা করুন

pg_dump -t view_name DB_name > db.sql

-t বিকল্পটি ==> ডাবল টেবিলগুলি (বা ভিউ বা ক্রম) টি মিলবে সারণী, উল্লেখ করুন


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