PostGIS तालिका से प्रत्येक स्तंभ का डेटा प्रकार प्राप्त करना?


9

मुझे एक तालिका में सभी स्तंभों के कॉलम डेटा प्रकारों को प्राप्त करने की आवश्यकता है, जिसमें ज्यामिति के प्रकार भी शामिल हैं। क्या मैं जानना चाहता था कि क्या कोई फंक्शन या एसक्यूएल है जो इस तरह से कुछ देता है:

column_name | data_type
------------+--------------
gid         | integer
descr       | character varying(32)
class       | character varying(10)
area        | double precision
geom        | geometry(Polygon,3763)

पर कुछ जवाब से stackexchange और gis.stackexchange मुझे पता है कि मैं इस क्वेरी के साथ जानकारी के कुछ प्राप्त कर सकते हैं:

SELECT 
    g.column_name,
    g.data_type,
    g.character_maximum_length,
    g.udt_name,
    f.type,
    f.srid
FROM 
     information_schema.columns as g JOIN
     geometry_columns AS f 
         ON (g.table_schema = f.f_table_schema and g.table_name = f.f_table_name )
WHERE
    table_schema = 'my_schema_name' and
    table_name = 'my_table_name'

परिणाम:

column_name | data_type         | character_maximum_length | udt_name | type    | srid
------------+-------------------+--------------------------+----------+---------+------
gid         | integer           |                          |          |         |
descr       | character varying | 32                       |          |         |
class       | character varying | 10                       |          |         |
area        | double precision  |                          |
geom        | USER-DEFINED      |                          | geometry | Polygon | 3763

लेकिन, क्या मुझे उस प्रारूप में जानकारी प्राप्त करने का एक उचित और व्यावहारिक तरीका है जो मुझे चाहिए? या क्या मुझे CASE WHENउस प्रारूप में किसी एक कॉलम में सभी कॉलम विशेषताओं को इकट्ठा करने के लिए संरचनाओं और स्ट्रिंग के संयोजन की "दुनिया" में प्रवेश करना चाहिए ?

मेरा डर है अगर एक गैर-अपेक्षित डेटा प्रकार ने मुझे info_schema.columns तालिका से अन्य विशेषता की आवश्यकता के लिए आश्चर्यचकित कर दिया। यानी, उदाहरण तालिका में, मैंने पहले कोई numeric (15,2)डेटा प्रकार का उपयोग नहीं किया था , जिसे एक अन्य विशेषताओं (संख्यात्मक_प्रदर्शन और संख्यात्मक_काले) का उपयोग करने की आवश्यकता होगी जो एक मामले को देखा जाए।

जवाबों:


14

सिद्धांत हाँ, हालांकि आप इसे वास्तव में बहुत जटिल पा सकते हैं।

  • हर तालिका (pg_class से चयन करें) में कॉलम हैं।
  • हर कॉलम (pg_attribute से चयन करें) में वैकल्पिक रूप से एक "टाइपमॉड" नंबर होता है।
  • टाइपमॉड के साथ प्रकारों के लिए (pg_type से चयन करें) एक "टाइपमॉडआउट" फ़ंक्शन होगा।
  • एक टाइपमॉड नंबर पर टाइपमोड रनिंग फ़ंक्शन चलाने से एक स्ट्रिंग वापस आ जाएगी जिसे उस प्रकार के नाम से संक्षिप्त किया जा सकता है, जिस तरह के उपयोगकर्ता-पठनीय हस्ताक्षर बनाने के लिए आप ('संख्यात्मक' का चयन करें) || numerictypmodout (744441) (भूगोल_typmod_out चुनें) (1107460))

लेकिन, हे, psql आप चाहते हैं तार उत्पन्न करता है, अगर हम देखते हैं कि SQL यह क्या उत्पन्न करता है, तो शायद इसका जवाब है।

निश्चित रूप से, एक जादू फ़ंक्शन है जो टाइपिड और टाइपमॉड लेता है और जादू स्ट्रिंग लौटाता है।

select a.attname, format_type(a.atttypid, a.atttypmod) from pg_attribute a where attname = 'geog';

Pg_class में शामिल होने के साथ आपको प्रति तालिका यह जानकारी प्राप्त करने में सक्षम होना चाहिए।


मुझे कोई परिणाम नहीं मिलता है where attname = 'geog'लेकिन = 'geom'काम करता है। यह मुझे मल्टीप्लगॉन, प्वाइंट और मल्टीप्वाइंट मूल्यों के लिए अच्छे परिणाम देता है, लेकिन मैं लाइन या मल्टीलाइन प्रकारों के लिए कुछ भी नहीं देखता हूं। क्या वे बहुभुज माने जाते हैं?
mkkeller

7

यह एक सरल SQL क्वेरी का उपयोग करके प्राप्त किया जा सकता है।

SELECT * from information_schema.columns where table_name='mytablename'


1
यह महान काम करता है! और यहां एक टिप है: आउटपुट एक प्रकार का लंबा हो सकता है, इसलिए आप अपने कंसोल पर विस्तारित प्रदर्शन को सक्षम करना चाह सकते हैं: \pset pagerपृष्ठ को बंद करने के लिए, फिर \xविस्तारित प्रदर्शन को सक्षम करने के लिए।
modulitos

7

साथ पॉल रैमसे मदद मैं इसे इस तरह बनाया:

SELECT a.attname as column_name, format_type(a.atttypid, a.atttypmod) AS data_type
FROM pg_attribute a
JOIN pg_class b ON (a.attrelid = b.relfilenode)
WHERE b.relname = 'my_table_name' and a.attstattarget = -1;

अपडेट करें

इस बीच मैंने एक निश्चित स्तंभ डेटा प्रकार के लिए पूछने के लिए एक फ़ंक्शन बनाया है

CREATE OR REPLACE FUNCTION "vsr_get_data_type"(_t regclass, _c text)
  RETURNS text AS
$body$
DECLARE
    _schema text;
    _table text;
    data_type text;
BEGIN
-- Prepare names to use in index and trigger names
IF _t::text LIKE '%.%' THEN
    _schema := regexp_replace (split_part(_t::text, '.', 1),'"','','g');
    _table := regexp_replace (split_part(_t::text, '.', 2),'"','','g');
    ELSE
        _schema := 'public';
        _table := regexp_replace(_t::text,'"','','g');
    END IF;

    data_type := 
    (
        SELECT format_type(a.atttypid, a.atttypmod)
        FROM pg_attribute a 
        JOIN pg_class b ON (a.attrelid = b.oid)
        JOIN pg_namespace c ON (c.oid = b.relnamespace)
        WHERE
            b.relname = _table AND
            c.nspname = _schema AND
            a.attname = _c
     );

    RETURN data_type;
END
$body$ LANGUAGE plpgsql;

उपयोग है:

SELECT vsr_get_data_type('schema_name.table_name','column_name')

-1

यदि आप ज्यामिति की जाँच करना चाहते हैं, तो आप 'INFORMATION_SCHEMA.COLUMNS' में 'udt_name' की जाँच कर सकते हैं और इसका उपयोग कर सकते हैं !:

select column_name,udt_name, data_type, character_maximum_length from INFORMATION_SCHEMA.COLUMNS where table_name =g

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.