क्वेरी, तालिका या दृश्य के आउटपुट कॉलम नाम और डेटा प्रकार वापस करने की क्वेरी


21

क्या कोई PostgreSQL क्वेरी या कमांड है जो फ़ील्ड नामों और फ़ील्ड प्रकारों की क्वेरी, तालिका या दृश्य लौटाता है?

उदाहरण के लिए, एक समाधान यदि सरल चयन क्वेरी पर लागू किया जाता है जैसे कि 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क्वेरीज हैं, यानी नॉन डेटा डिफाइनिंग या डेटा मैनिपुलेशन क्वेश्चन, चाहे टेबल पर, व्यूज, या अन्य क्वेश्चन डेटा की पंक्तियों और कॉलमों को लौटाते हैं, इसलिए PostgreSQL को वापस करने में सक्षम होना चाहिए स्तंभ नामों और उनके डेटा प्रकारों की सूची। information_schemaविचारों जवाब में नीचे वर्णित टेबल और विचारों के लिए यह जवाब देने के लिए प्रकट होता है। मनमाने ढंग से चयनित प्रश्न अंतिम सीमा हैं। मैं बेहतर तरीके से समझाने के उत्तर को संपादित
करूंगा

जवाबों:


22

सूचना स्कीमा बनाम सिस्टम कैटलॉग

हमने कई बार इस बारे में चर्चा की है। सूचना स्कीमा कुछ उद्देश्यों को पूरा करती है। यदि आप सिस्टम कैटलॉग के आसपास अपना रास्ता जानते हैं, तो वे अधिकांश उद्देश्यों को बेहतर तरीके से पूरा करते हैं , आईएमओ। सिस्टम कैटलॉग सभी सूचनाओं का वास्तविक स्रोत है।

जानकारी स्कीमा मानकीकृत बार देखा गया जो पोर्टेबिलिटी, ज्यादातर प्रमुख Postgres संस्करणों में के साथ मदद, क्योंकि अलग आरडीबीएमएस प्लेटफार्मों पर पोर्टेबिलिटी आम तौर पर एक भ्रम है एक बार अपने प्रश्नों प्रणाली कैटलॉग को देखने के लिए जरूरत के लिए परिष्कृत पर्याप्त हैं प्रदान करता है। और, विशेष रूप से, ओरेकल अभी भी जानकारी स्कीमा का समर्थन नहीं करता है।

जानकारी में दृश्य स्कीमा मानक का अनुपालन करने वाले प्रारूप को प्राप्त करने के लिए कई हुप्स के माध्यम से कूदना चाहिए। यह उन्हें धीमा करता है, कभी-कभी बहुत धीमी गति से। इन मूल वस्तुओं के लिए योजनाओं और प्रदर्शन की तुलना करें:

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

संबंधित जवाब:

सूची पेशेवरों और विपक्षों , सबसे बड़े पेशेवरों (IMO) को बोल्ड में:

सूचना स्कीमा के विचार

  • अक्सर सरल (निर्भर करता है)
  • धीमा
  • पूर्वनिर्मित, जो आपकी आवश्यकताओं के अनुरूप हो भी सकता है और नहीं भी
  • चयनात्मक (उपयोगकर्ता केवल उन वस्तुओं को देखते हैं जिनके लिए उनके पास विशेषाधिकार हैं)
  • SQL मानक के अनुरूप (यह कुछ प्रमुख RDBMS द्वारा कार्यान्वित किया गया है)
  • ज्यादातर पोर्टेबल प्रमुख पोस्टग्रेज संस्करणों में
  • Postgres के बारे में अधिक विशिष्ट ज्ञान की आवश्यकता नहीं है
  • पहचानकर्ता वर्णनात्मक, लंबे और कभी-कभी अजीब होते हैं

सिस्टम कैटलॉग

  • अक्सर अधिक जटिल (निर्भर करता है), स्रोत के करीब
  • तेज
  • पूरा (जैसे सिस्टम कॉलमoid शामिल)
  • SQL मानक के अनुरूप नहीं है
  • प्रमुख पोस्टग्रेज संस्करणों में कम पोर्टेबल (लेकिन मूल बातें बदलने वाली नहीं हैं)
  • Postgres के बारे में अधिक विशिष्ट ज्ञान की आवश्यकता है
  • पहचानकर्ता प्रवण, कम वर्णनात्मक लेकिन सुविधाजनक रूप से कम हैं

मनमानी क्वेरी

किसी क्वेरी से स्तंभ नामों और प्रकारों की समान सूची प्राप्त करने के लिए, आप एक साधारण ट्रिक का उपयोग कर सकते हैं: क्वेरी आउटपुट से एक अस्थायी तालिका बनाएं , फिर ऊपर जैसी तकनीकों का उपयोग करें।

आप LIMIT 0वास्तविक डेटा की जरूरत नहीं है, आप कर सकते हैं :

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

अलग-अलग कॉलम के डेटा प्रकार प्राप्त करने के लिए, आप फ़ंक्शन का उपयोग कर सकते हैं pg_typeof():

SELECT pg_typeof(1);

बहुत बहुत धन्यवाद। मैं देख रहा हूँ कि कैसे थोड़ी देर के लिए pg_attribute में कॉलम का डेटाटाइप पाने के लिए और बस इस पोस्ट के पार आया। अपनी पोस्ट की सराहना करें।
मेलिंडा

यह सामान्य रूप से सहायक है, लेकिन मूल प्रश्न का उत्तर नहीं देता है कि स्तंभ के डेटा प्रकारों के बारे में जानकारी कैसे प्राप्त की जाए, एक SELECT स्टेटमेंट डिलीवर करता है। यह विचारों या तालिकाओं के स्तंभों के बारे में नहीं था , जो निश्चित रूप से सिस्टम कैटलॉग में रहते हैं और सूचना स्कीमा में भी दिखाए जाते हैं।
होल्गर जकॉब्स

2

आप psqlकमांड लाइन क्लाइंट का उपयोग कर सकते हैं ।

\dt तालिका की एक सूची दिखाएगा

\dv विचारों की एक सूची दिखाएगा

\d [object_name] तालिका या दृश्य के स्कीमा का वर्णन करेगा

यकीन नहीं है कि आप एक क्वेरी का वर्णन कैसे करेंगे।

अधिक जानकारी: https://manikandanmv.wordpress.com/tag/basic-psql-commands/


2

यदि आपके पास pg_catalog पर पहुंच है और PgAdmin3 का उपयोग करते हैं, तो मैं वेलेंटाइन टेक ब्लॉग ( http://tech.valgog.com/2011/02/pgadmin-ii-macros-get-table-fields) पर पाया गया एक समाधान सुझाता हूं । html )। यह एक 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किसी चीज़ को कैसे निष्पादित किया जाता है \dt, तो चलाएं psql -E- यह क्वेरी प्रिंट करेगा। हालाँकि, यह आमतौर पर उपयोग करने के लिए बेहतर है information_schemaअगर यह आपकी आवश्यकताओं को पूरा करेगा।


1

यह अत्यधिक सरल हो सकता है, लेकिन pgAdmin4 आउटपुट परिणामों में फ़ील्ड प्रकार दिखाता है। ऊपर दिए गए अन्य समाधान शायद अधिक सुरुचिपूर्ण हैं, लेकिन जब मुझे बस एक त्वरित उत्तर की आवश्यकता होती है, तो मुझे लगता है कि pgAdmin4 की क्वेरी GUI बहुत अच्छी तरह से काम करती है। दृश्य या फ़ंक्शन द्वारा लौटाए गए परिकलित फ़ील्ड के फ़ील्ड प्रकार का पता लगाने की कोशिश करना मुश्किल हो सकता है।

यहाँ छवि विवरण दर्ज करें


यह बहुत अच्छा है कि pgAdmin4 यह करता है, लेकिन यह कैसे करता है? क्या हम PgAdmin4 के सभी स्रोत कोड के माध्यम से स्कैन किए बिना पता लगा सकते हैं ?
होल्गर जकॉब्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.