আউটপুট কলামের নাম এবং কোনও ক্যোরি, টেবিল বা দৃশ্যের ডেটা ধরণের ফেরত দেওয়ার প্রশ্ন


21

পোস্টগ্রিএসকিউএল কোয়েরি বা কমান্ড রয়েছে যা ক্ষেত্রের নাম এবং কোনও ক্যোয়ারির ক্ষেত্রের নাম, সারণী বা দর্শনটি দেয়?

উদাহরণস্বরূপ, কোনও সমাধান যেমন সরল নির্বাচন জিজ্ঞাসায় প্রয়োগ করা হয় তেমন SELECT * from personএকটি তালিকা ফিরে আসা উচিত:

Column Name   | Column Type
===========================
First Name    | character
Last Name     | character
Age           | integer
Date of Birth | date

আমি information_schemaনীচে একটি উত্তরে বর্ণিত মতামত সন্ধান করেছি এবং এটি টেবিলগুলি বেশ ভালভাবে কভার করে বলে মনে হচ্ছে, এবং আমার সন্দেহ হয় যে এটিতে মতামতগুলিও কভার করা হয়েছে তবে আমি এখনও এটি পরীক্ষা করে দেখিনি।

গত কোনো অবাধ কিন্তু বৈধ ক্যোয়ারী নির্বাচন যেমন জড়িত হয় JOINS, UNIONSইত্যাদি, ডাটাবেজ উপর। কোনও অন্তর্নিহিত প্রক্রিয়া, বা অন্যান্য সঞ্চিত পদ্ধতি বা স্ক্রিপ্ট কি কোনও বৈধ QUERY এর জন্য একই ফিরিয়ে দিতে পারে?

আমি এমন একটি প্রোগ্রাম বিকাশ করছি যা ডেটা তৈরি করে এবং অনুসন্ধানের ফর্ম তৈরি করে এবং ডেটা বৈধকরণ এবং প্রত্যাবর্তিত ডেটাতে ফাংশন সম্পাদন করার জন্য তথ্য প্রয়োজন।


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

1
সরলতার কারণ হ'ল ক্লায়েন্টরা যতক্ষণ উদ্বিগ্ন প্রশ্নগুলি যেমন SELECTপ্রশ্নগুলি, যেমন টেবিল, ভিউ, বা অন্যান্য প্রশ্নগুলিতে ডাটাগুলির সারি এবং কলামগুলি ফেরত দেয়, তথ্যের সাথে সংজ্ঞা না দেওয়া বা ডেটা ম্যানিপুলেশন অনুসন্ধানগুলি, সুতরাং পোস্টগ্র্যাসকিউএল একটি ফেরত দিতে সক্ষম হওয়া উচিত কলামের নাম এবং তাদের ডেটা ধরণের তালিকা। information_schemaমতামত উত্তর নিচে উল্লিখিত সারণি এবং মতামত জন্য এটি উত্তর বলে মনে হচ্ছে। স্বেচ্ছাসেবী নির্বাচন নির্বাচনগুলি চূড়ান্ত সীমান্ত হয়। আমি উত্তরটি আরও ভালভাবে ব্যাখ্যা করার জন্য সম্পাদনা করব
vfclists

উত্তর:


22

তথ্য স্কিমা বনাম সিস্টেম ক্যাটালগ

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

তথ্য স্কিমা আদর্শায়িত দেখা হয়েছে সেই বহনযোগ্যতা, বেশিরভাগ প্রধান Postgres সংস্করণ জুড়ে সাহায্যের কারণ বিভিন্ন RDBMS প্ল্যাটফর্ম জুড়ে বহনযোগ্যতা সাধারণত একটি বিভ্রম একবার আপনার প্রশ্ন সিস্টেম ক্যাটালগ সন্ধান করার প্রয়োজন অত্যাধুনিক যথেষ্ট প্রদান করে। এবং উল্লেখযোগ্যভাবে, ওরাকল এখনও তথ্যের স্কিমা সমর্থন করে না।

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

EXPLAIN ANALYZE SELECT * from information_schema.columns;
EXPLAIN ANALYZE SELECT * from pg_catalog.pg_attribute;

পার্থক্যটি লক্ষণীয়। এটি আপনি যা খুঁজছেন তার উপর নির্ভর করে।

আপনার উদাহরণ

আপনার উদাহরণস্বরূপ SELECT * from tbl, এই সাধারণ টেবিলের জন্য নীচের দুটি প্রশ্নের তুলনা করুন:

CREATE TEMP TABLE foo(
   A numeric(12,3)
 , b timestamp(0)
);

ব্যবহার pg_attribute:

SELECT attname, format_type(atttypid, atttypmod) AS type
FROM   pg_attribute
WHERE  attrelid = 'foo'::regclass
AND    attnum > 0
AND    NOT attisdropped
ORDER  BY attnum;

format_type() সমস্ত সংশোধক সঙ্গে সম্পূর্ণ টাইপ প্রদান:

attname | type
--------+-------------------------------
a       | numeric(12,3)
b       | timestamp(0) without time zone

এছাড়াও নোট করুন যে regclassসারণীটির নামটি বর্তমান অনুসারে কিছুটা বুদ্ধিদীপ্তভাবে সমাধান করতে হবে search_path। নামটি বৈধ না হলে এটি একটি ব্যতিক্রমও উত্থাপন করে। বিবরণ:

ব্যবহার information_schema.columns:

SELECT column_name, data_type
FROM   information_schema.columns
WHERE  table_name = 'foo'
ORDER  BY ordinal_position;

তথ্য মানসম্পন্ন, তবে অসম্পূর্ণ :

column_name | data_type
------------+----------------------------
a           | numeric
b           | timestamp without time zone

ডেটা টাইপের সম্পূর্ণ তথ্য পেতে আপনাকে এই সমস্ত কলামগুলি অতিরিক্ত বিবেচনা করতে হবে:

character_maximum_length
character_octet_length
numeric_precision
numeric_precision_radix
numeric_scale
datetime_precision
interval_type
interval_precision

সম্পর্কিত উত্তর:

ভাল ও বিপরীতে একটি তালিকা , সবচেয়ে বড় পেশাদার (আইএমও) সাহসী:

তথ্য স্কিমা দর্শন

  • প্রায়শই সহজ (নির্ভর করে)
  • ধীর
  • প্রিপ্রোসেসড, যা আপনার প্রয়োজন অনুসারে বা নাও পারে
  • বাছাই করা (ব্যবহারকারীরা কেবলমাত্র সেগুলির জন্য বিশেষাধিকারযুক্ত জিনিসগুলি দেখে)
  • একটি এসকিউএল স্ট্যান্ডার্ড অনুসারে (এটি কিছু বড় আরডিবিএমএস প্রয়োগ করে)
  • প্রধানত পোস্টগ্রিজ সংস্করণ জুড়ে বহনযোগ্য
  • পোস্টগ্রিস সম্পর্কে খুব নির্দিষ্ট জ্ঞানের প্রয়োজন নেই
  • সনাক্তকারীরা বর্ণনামূলক, দীর্ঘ এবং কখনও কখনও বিশ্রী হয়

সিস্টেম ক্যাটালগ

  • উত্সের কাছাকাছি প্রায়শই আরও জটিল (নির্ভরশীল)
  • দ্রুত
  • সম্পূর্ণ (যেমন সিস্টেম কলাম oidঅন্তর্ভুক্ত)
  • একটি এসকিউএল স্ট্যান্ডার্ড অনুসরণ না
  • বড় পোস্টগ্রিজ সংস্করণ জুড়ে কম পোর্টেবল (তবে মূল বিষয়গুলি পরিবর্তন হবে না)
  • পোস্টগ্রিস সম্পর্কে আরও নির্দিষ্ট জ্ঞানের প্রয়োজন
  • সনাক্তকারীগুলি সংক্ষিপ্ত, কম বর্ণনামূলক তবে স্বাচ্ছন্দ্যে সংক্ষিপ্ত

নির্বিচার জিজ্ঞাসা

কোনও ক্যোয়ারী থেকে কলামের নাম এবং ধরণের একই তালিকা পেতে, আপনি একটি সহজ কৌশলটি ব্যবহার করতে পারেন: ক্যোয়ারী আউটপুট থেকে একটি অস্থায়ী টেবিল তৈরি করুন , তারপরে উপরের মতো একই কৌশলগুলি ব্যবহার করুন।

আপনি সংযুক্ত করতে পারেন LIMIT 0, যেহেতু আপনার প্রকৃত ডেটার প্রয়োজন নেই:

CREATE TEMP TABLE tmp123 AS
SELECT 1::numeric, now()
LIMIT  0;

পৃথক কলামগুলির ডেটা ধরণের তথ্য পেতে, আপনি এই ফাংশনটিও ব্যবহার করতে পারেন pg_typeof():

SELECT pg_typeof(1);

তোমাকে অনেক ধন্যবাদ. আমি কীভাবে কিছুক্ষণের জন্য পিজি_ট্রিবিউটে কলামটির ডেটাটাইপ পেতে পারি তা সন্ধান করছিলাম এবং কেবল এই পোস্টটি জুড়ে এসেছিল। আপনার পোস্টের প্রশংসা করুন।
মেলিন্ডা

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

2

আপনি psqlকমান্ড লাইন ক্লায়েন্ট ব্যবহার করতে পারেন ।

\dt টেবিলের একটি তালিকা প্রদর্শন করবে

\dv দর্শনগুলির তালিকা প্রদর্শন করবে

\d [object_name] টেবিল বা দৃশ্যের স্কিমা বর্ণনা করবে

আপনি কীভাবে কোনও প্রশ্নের বিবরণ দিবেন তা নিশ্চিত নন।

আরও তথ্য: https://manikandanmv.wordpress.com/tag/basic-psql-commands/


2

আপনার যদি পিজি-ক্যাটাগল অ্যাক্সেস থাকে এবং পিজএডমিন 3 ব্যবহার করেন তবে আমি ভ্যালেন্টাইনস টেক ব্লগে ( http://tech.valgog.com/2011/02/pgadmin-iii-macros-get-table-fields) খুঁজে পেয়েছি এমন একটি সমাধানের জন্য আমি খুব সুপারিশ করি । এইচটিএমএল )। এটি একটি PgAdmin3 ম্যাক্রো যা একটি নির্বাচিত সারণীর নামের সংজ্ঞা প্রদর্শন করতে শর্টকাট দিয়ে অ্যাক্সেস করা যায়।

select quote_ident(nspname) || '.' || quote_ident(relname) as table_name, 
       quote_ident(attname) as field_name, 
       format_type(atttypid,atttypmod) as field_type, 
       case when attnotnull then ' NOT NULL' else '' end as null_constraint,
       case when atthasdef then 'DEFAULT ' || 
                                ( select pg_get_expr(adbin, attrelid) 
                                    from pg_attrdef 
                                   where adrelid = attrelid and adnum = attnum )::text else ''
       end as dafault_value,
       case when nullif(confrelid, 0) is not null
            then confrelid::regclass::text || '( ' || 
                 array_to_string( ARRAY( select quote_ident( fa.attname ) 
                                           from pg_attribute as fa 
                                          where fa.attnum = ANY ( confkey ) 
                                            and fa.attrelid = confrelid
                                          order by fa.attnum 
                                        ), ','
                                 ) || ' )'
            else '' end as references_to
  from pg_attribute 
       left outer join pg_constraint on conrelid = attrelid 
                                    and attnum = conkey[1] 
                                    and array_upper( conkey, 1 ) = 1,
       pg_class, 
       pg_namespace
 where pg_class.oid = attrelid
   and pg_namespace.oid = relnamespace
   and pg_class.oid = btrim( '$SELECTION$' )::regclass::oid
   and attnum > 0
   and not attisdropped
 order by attrelid, attnum;

মোহন এবং অত্যন্ত দরকারী মত কাজ করে।


1

দর্শনগুলি ব্যবহার করুনinformation_schema , তারা এসকিউএল-স্ট্যান্ডার্ড এবং আপনার পছন্দসই তথ্য ধারণ করে।

আপনি সরাসরি এক্সেস pg_class, pg_attributeইত্যাদি, কিন্তু যে unportable এবং প্রায়ই fiddlier এর; আপনার প্রয়োজন হতে পারে মত সাহায্যকারী ফাংশনoidvectortypes , pg_get_function_argumentsকিছু জিনিসের জন্য, ইত্যাদি।

আপনি কেমন দেখতে চান psqlমত, executes কিছু \dt, চালানো psql -E- এটা ক্যোয়ারী মুদ্রণ করব। তবে এটি information_schemaআপনার প্রয়োজন মেটাতে পারলে সাধারণত এটি ব্যবহার করা ভাল ।


1

এটি অত্যধিক সহজ হতে পারে তবে pgAdmin4 আউটপুট ফলাফলের ক্ষেত্রে ক্ষেত্রের প্রকারগুলি দেখায়। উপরের অন্যান্য সমাধানগুলি সম্ভবত আরও মার্জিত, তবে যখন আমার কেবলমাত্র একটি উত্তরের প্রয়োজন হবে তখন আমি পগা অ্যাডমিন 4 এর ক্যোয়ারী জিইআইআই বেশ ভালভাবে কাজ করে দেখি। কোন দর্শন বা ফাংশন দ্বারা ফেরত গণনা করা ক্ষেত্রের ক্ষেত্রের ধরণটি বের করার চেষ্টা করা জটিল can

এখানে চিত্র বর্ণনা লিখুন


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