2010-09-07 13 views
27

information_schema kullanarak eşdeğer SQL \ dT bulmaya çalışıyorum ve hiçbir şey bulamıyorum. Böyle bir şey var mı?Postgres information_schema kullanarak özel türler nasıl listelenir?

Örnek: Aşağıdaki özel yazım nesnesini eklerseniz, bilgiyi information_schema'da nasıl görebilirim?

CREATE TYPE communication.channels AS ENUM 
    ('text_message', 
    'email', 
    'phone_call', 
    'broadcast'); 

NOT: Ben \ dT tarafından kullanılan kesin SQL var (günlüğünü dönüm tarafından alınan) ama

+0

, pgAdmin – DrColossos

+0

süper "temiz" yolu sorguyu sarmak için olduğunu yapabilir manzara. Ayrıca her zaman googling tutmak zorunda kalmadan sorgu kaydeder, heh http://albertech.blogspot.com/2016/12/show-all-custom-defined-types-in.html – jar

cevap

8

Enümler, SQL standardında değildir ve bu nedenle bilgi şemasında gösterilmez. Diğer kullanıcı tanımlı türler normalde user_defined_types görünümünde olabilir, ancak bu uygulanmadı. Şu anda, PostgreSQL'de kullanıcı tanımlı türler listelemek için bilgi şemasını kullanamazsınız.

0

burada göz information_schema kullanarak daha temiz bir uygulama için özel olarak arıyorum: http://www.postgresql.org/docs/current/static/catalog-pg-enum.html

pg_enum katalog Eğer Başvuru için

+0

Ne yazık ki pg_enum katalog yalnızca şema etiketini veya şema veya başka bir şeyi içermez. Bu nedenle, anlamlı verileri elde etmek için yine de bir katılım yapmanız gerekir –

35

ön aradığınız verilere sahip olmalıdır, burada (pgAdmin aynı veya benzer kullanır) \ dT SQL olduğunu

SELECT  n.nspname as schema, t.typname as type 
FROM  pg_type t 
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace 
WHERE  (t.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) 
AND  NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = t.typelem AND el.typarray = t.oid) 
AND  n.nspname NOT IN ('pg_catalog', 'information_schema') 
+0

Bu kod, kullanıcı tanımlı enumlar dahil olmak üzere tüm türlerin listesini görüntüler, ancak bunların nasıl tanımlandığına dair ayrıntıları vermez. –

9

Geçerli veritabanındaki tüm tanımlı tanımlı türlerin listelenmesinin basit bir yolu budur.

SELECT pg_type.typname AS enumtype, 
    pg_enum.enumlabel AS enumlabel 
FROM pg_type 
JOIN pg_enum 
    ON pg_enum.enumtypid = pg_type.oid; 
+1

"AS enumlabel" kısmı gereksizdir, sence de öyle değil mi? – Pere

2

benim enum isimleri göstermek için bir görünümü kullanın: sorgu sonucu her enum türleri iki sütun, ilk gösterisini adı, ikinci gösterisini her numaralama tipi için her değerin adı döndürür. Bu görünümden elde edilen veriler sonuç olarak bir uygulama alanında bir enum alanı için mevcut seçeneklerin bir listesini sağlamak için kullanılabilir. Senin kendini türlerine göre tanımlanmış tüm

CREATE OR REPLACE VIEW vw_enums AS 
SELECT t.typname, e.enumlabel, e.enumsortorder 
FROM pg_enum e 
JOIN pg_type t ON e.enumtypid = t.oid;
6

Listesi: CommandLine kullanmak istemiyorsanız

\dT 

testDB=> \dT 
       List of data types 
Schema |   Name   | Description 
--------+-------------------------+------------- 
public | myType     | 
(1 row) 
İlgili konular