আমি কীভাবে একটি নির্দিষ্ট টেবিলের জন্য সমস্ত কলাম তালিকাভুক্ত করব


292

আমি একটি ডাটাবেসে একটি সুনির্দিষ্ট তথ্য খুঁজছি যা সম্পর্কে আমার কোনও জ্ঞান নেই।

এটি একটি তৃতীয় পক্ষের পণ্য, তারা কিছু প্রশ্নের উত্তর দিতে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে চলবে এবং আমি জানি যে তথ্যটি সেই ডিবিতে পড়ে আছে, তাই আমি কিছুটা রেট্রো ইঞ্জিনিয়ারিং করতে চাই।

একটি সারণী দেওয়া, এই টেবিলের জন্য কলামগুলির নামের তালিকা থাকা কি সম্ভব?

উদাহরণস্বরূপ স্কেল সার্ভারে, টেবিলটি পুনরায় ব্যবহারযোগ্য CREATEস্টেটমেন্টে ডাম্প করা সম্ভব , যা টেবিলটি টেবিল দ্বারা রচিত সমস্ত কলামকে টেক্সটলে তালিকাবদ্ধ করে।


ডিবিতে আপনার কী ধরণের অ্যাক্সেস রয়েছে?
dezso

@ ডিজেসো, এটি একটি পৃথক মেশিনে রয়েছে, তবে আমি এটিতে লগইন করতে পারি এবং প্রশাসকের অধিকার সহ পিএসকিএল কমান্ড লাইন চালু করতে পারি
স্টিফেন রোল্যান্ড

6
যদি আমি আপনি সঠিকভাবে বুঝতে, আপনি পরে হয় \dt[+] table_nameমধ্যে psql
dezso

1
নাঃ। t dt + কলামের নামটি স্পষ্টভাবে প্রদর্শন করছে বলে মনে হচ্ছে না। এটি কেবলমাত্র "বিবরণ" ফিল্ড যুক্ত করে।
স্টিফেন রোল্যান্ড

12
কিন্তু table d + টেবিলের নাম কাজ করে!
স্টিফেন রোল্যান্ড

উত্তর:


344

\d+ <table_name>আপনি ইতিমধ্যে খুঁজে পাওয়া কমান্ড লাইন ছাড়াও , আপনি কলামের ডেটা সন্ধান করতে তথ্য স্কিমা ব্যবহার করে এটি ব্যবহার করতে পারেন information_schema.columns:

SELECT *
  FROM information_schema.columns
 WHERE table_schema = 'your_schema'
   AND table_name   = 'your_table'
     ;

দ্রষ্টব্য: উপরের উদাহরণ অনুসারে, মানগুলি উদ্ধৃতিতে আবদ্ধ রয়েছে তা নিশ্চিত করুন।


2
Psql ইন, ব্যবহার \x onবা \pset expanded onএইভাবে সহজ কোয়েরি ফলাফল রৈখিক (ট্যাবুলার পরিবর্তে) করতে এবং পড়তে stackoverflow.com/a/9605093/513397
anishpatel

4
বর্তমান সংস্করণগুলিতে (9..6 এ \d+ public.*এটি ব্যবহার করে দেখুন) publicস্কিমায় আপনার সমস্ত সারণী এবং দর্শনগুলির বিবরণ (স্কিমা + অভ্যাস / ফকি / ট্রিগার) পেতে আপনি পিএসকিএল করতে পারেন do আমরা প্রতিটি প্রতিশ্রুতি দ্বারা তৈরি ডিবি-র পরিবর্তনের বিষয়টি ট্র্যাক রাখতে আমাদের প্রাক-কমিট হুক স্ক্রিপ্টে এটি ব্যবহার করি।
থালিস কে।

4
কেবল কলামের নাম পেতে কলাম_নাম নির্বাচন করুন
অ্যান্ড্রু

82

অন্যান্য উত্তরের পরিপূরক হিসাবে, এমনকী একটি নির্বাচনী বিবৃতি যা কোনও সারি দেয় না সেগুলি আপনাকে এবং অ্যাপ্লিকেশন কোডটিতে কলামের নাম প্রকাশ করবে।

select *
from table_name
where false;

অনুমতিগুলি এইগুলির মধ্যে যে কোনও একটির সাথে কার্যকর হতে পারে।


আমি অনুমান করি যে আপনি এই এসকিউএলকে পিএসএইচএল কমান্ডটি দিয়ে গেছেন। আউটপুটটিতে চমক এড়াতে আমি সেই ক্ষেত্রে --no-psqlrc বিকল্পটি ব্যবহার করার পরামর্শ দিচ্ছি।
জনমদ্দুর

লুকানো কলামগুলি বাদে, যা নির্দিষ্ট করতে হবে (pg_class.oid এর মত)
Okutane

71

তথ্য স্কিমা ধীর এবং নিশ্চিত উপায়: এটি প্রমিত এবং মূলত অন্যান্য ডাটাবেস এটি সমর্থন করার জন্য পোর্টেবল। এবং এটি বড় সংস্করণ জুড়ে কাজ চালিয়ে যাবে।

যাইহোক, তথ্য স্কিমার দর্শনগুলি প্রায়শই কঠোরভাবে মানকযুক্ত ফর্ম্যাটটি পূরণের জন্য সিস্টেম ক্যাটালগগুলি থেকে অনেকগুলি টেবিলে যোগদান করে - যার মধ্যে বেশিরভাগ সময় কেবল মৃত ফ্রেইট থাকে। এটি তাদের ধীর করে তোলে ।
পোস্টগ্রিস বিকাশকারীরা প্রতিশ্রুতি দিচ্ছে না, তবে বেসিকগুলি (এখানে যা প্রয়োজন তার মতো) বড় সংস্করণগুলিতে পরিবর্তন করতে যাচ্ছেনা।

psql(নেটিভ কমান্ড-লাইন ইন্টারফেস) অবশ্যই দ্রুত গলিটি নেয় এবং সরাসরি উত্সটি অনুসন্ধান করে। আপনি যদি psqlপ্যারামিটার দিয়ে-E শুরু করেন তবে ব্যাকস্ল্যাশ কমান্ডের মতো এসকিউএল \dপ্রদর্শিত হবে। অথবা \set ECHO_HIDDEN onপিএসকিএল কমান্ড লাইন থেকে সেখান থেকে শুরু করে আপনি আপনার প্রশ্নের উত্তর তৈরি করতে পারেন।

একটি সারণী দেওয়া, এই টেবিলের জন্য কলামগুলির নামের তালিকা থাকা কি সম্ভব?

SELECT attrelid::regclass AS tbl
     , attname            AS col
     , atttypid::regtype  AS datatype
       -- more attributes?
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytable'::regclass  -- table name, optionally schema-qualified
AND    attnum > 0
AND    NOT attisdropped
ORDER  BY attnum;

জিজ্ঞাসাবাদ করারinformation_schema.columns চেয়ে আরও দ্রুত । EXPLAIN ANALYZEনিজের জন্য দেখার চেষ্টা করুন । এখনও একবারের জন্য সন্ধানের জন্য গুরুত্বপূর্ণভাবে নয়। তবে বহুবার পুনরাবৃত্তি হওয়া কোনও ক্যোয়ারী / ফাংশনে ব্যবহৃত হলে কোনও পার্থক্য হতে পারে।

দৃশ্যমানতার মধ্যেও সূক্ষ্ম পার্থক্য রয়েছে। বিস্তারিত তুলনা:


2
সত্যিই এর মতো আপনি আপনাকে দেখান -Eএবং কীভাবে পিএসএলএল এর এসকিএল পাবেন তা লোকেদের দেখান।
ইভান ক্যারল 20

6

psql PostgreSQL 11+ এ

যদি আপনি কোনও ক্যোয়ারিতে কলামের প্রকারগুলি সন্ধান করে থাকেন তবে আপনি এর ব্যবহার করতে পারেনpsql\gdesc

SELECT
    NULL AS zero,
    1 AS one,
    2.0 AS two,
    'three' AS three,
    $1 AS four,
    sin($2) as five,
    'foo'::varchar(4) as six,
    CURRENT_DATE AS now
\gdesc
 Column |         Type         
--------+----------------------
 zero   | text
 one    | integer
 two    | numeric
 three  | text
 four   | text
 five   | double precision
 six    | character varying(4)
 now    | date
(8 rows)

0

কেবল পোস্টগ্রিজ এসকিউএল

এটি কিছুটা হকি তবে আপনি যদি সবচেয়ে কম সংখ্যক এসকিউএল খুঁজছেন তবে এটি একজন প্রতিযোগী হতে পারে:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))

বা এমনকি আরও ছোট (ধরে নিলে টেবিলের মধ্যে কমপক্ষে একটি সারি উপস্থিত রয়েছে)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))

তালিকা অর্ডার সংরক্ষণ করে। আপনি যদি অর্ডারটির বিষয়ে চিন্তা না করেন এবং hstoreএক্সটেনশন ইনস্টল করেছেন তবে আপনি আরও খাটো করতে পারেন

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