PostGIS tablosundan her bir sütunun veri türünü mü alıyorsunuz?


9

Geometri türleri de dahil olmak üzere bir tablodaki tüm sütunların sütun veri türlerini almam gerekiyor. Ne bilmek istedim bir işlev veya böyle bir şey veren SQL varsa:

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

Üzerinde birkaç yanıtlarından Stack Exchange ve gis.stackexchange ben şu sorgu ile bazı bilgileri alabilirsiniz biliyor:

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'

Sonuç:

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

Ancak, bilgileri ihtiyacım olan formatta almanın daha pratik bir yolu var mı? Yoksa CASE WHENtüm sütun niteliklerini bu biçimde tek bir sütunda toplamak için yapıların ve dize birleşiminin "dünyasını" girmeli miyim ?

Benim korkum, beklenmeyen bir veri türünün, bilgi_sistemi sütunları tablosundan başka bir özelliğe ihtiyaç duyması beni şaşırtmasıdır. Yani, daha önce örnek tabloda, numeric (15,2)bir VAKA ZAMANI tarafından ayrıştırılması için başka bir öznitelik (sayısal_doğrulama ve sayısal_asal) kullanması gereken herhangi bir veri türü kullanmadım.

Yanıtlar:


14

Teori evet, gerçekten çok karmaşık bulabilirsiniz.

  • Her tablonun (pg_class öğesinden * seçin) sütunları vardır.
  • Her sütunun (pg_attribute'dan * seçin) isteğe bağlı olarak bir "typmod" numarası vardır.
  • Typmodlu türler için (pg_type'den * seçin) bir "typmodout" işlevi olacaktır.
  • Typmod out işlevinin bir typmod numarasında çalıştırılması, alışkın olduğunuz kullanıcı tarafından okunabilir imza türünü oluşturmak için tür adıyla birleştirilebilen bir dize döndürür ('numeric' || numerictypmodout (786441)) seçin (geography_typmod_out seçin (1107460))

Ama, hey, psql istediğiniz dizeleri üretir, hangi SQL'i ürettiğine bakarsak, belki de cevap oradadır.

Tabii ki, bir typeid ve typmod alan ve sihirli dizeyi döndüren sihirli bir işlev var.

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

Pg_class'a katıldığınızda bu bilgiyi tablo başına alabilmelisiniz.


İçin herhangi bir sonuç alamıyorum where attname = 'geog'ama = 'geom'işe yarıyor. Bu bana MultiPolygon, Point ve MultiPoint değerleri için iyi sonuçlar veriyor, ancak Line veya MultiLine türleri için hiçbir şey görmüyorum. Bunlar çokgen sayılıyor mu?
mhkeller

7

Basit bir SQL sorgusu kullanarak elde edilebilir.

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


1
Harika çalışıyor! İşte size bir ipucu: Çıktı biraz uzun olabilir, bu nedenle konsolunuzda genişletilmiş ekranı etkinleştirmek isteyebilirsiniz: \pset pagersayfayı kapatmak, ardından \xgenişletilmiş ekranı etkinleştirmek için.
Modullar

7

İle Paul Ramsey yardımı Ben öyle yaptı:

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;

GÜNCELLEME

Bu arada belirli bir sütun veri türü istemek için bir işlev oluşturdum

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;

Kullanımı:

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

-1

geometri türünü kontrol etmek istiyorsanız, 'BİLGİ_SCHEMA.COLUMNS' öğesinden 'udt_name' öğesini kontrol edebilir ve kullanabilirsiniz !:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.