Soru Bir kullanıcı tanımlı postgresql numaralandırılmış tür tanımı göstermek için bir yolu var mı?


Bir postgresql türü tanımladığımızı varsayalım:

CREATE TYPE my_type AS ENUM('foo', 'bar');

Oluşturulduktan sonra tür tanımını göstermenin herhangi bir yolu var mı?

Bana "ENUM" ('foo', 'bar') 'gösterecek "\ d my_type" beklerdim, ama diyor ki:

Did not find any relation named "my_type"

Pg_type tablosu yeterli bilgi vermemektedir.


44
2018-03-02 15:31


Menşei




Cevaplar:


\'T sonra \'T, ama bir "CREATE" ifadesi olarak vermez. Alanlar için \ dD kullanıyorsunuz.

\dT+ action.action_status
                          List of data types
 Schema |         Name         | Internal name | Size | Elements | Description 
--------+----------------------+---------------+------+----------+-------------
 action | action.action_status | action_status | 4    | pending +| 
        |                      |               |      | live    +| 
        |                      |               |      | done    +| 
        |                      |               |      | notdone  | 
(1 row)

63
2018-03-02 16:45



"Etki alanları için kullan \ d \" ın alaka düzeyini anlamıyorum. - Faheem Mitha
Alanlar ve türleri farklı şeylerdir. Alanlar için \ dD ve türler için \ dt kullanıyorsunuz. - Richard Huxton
Tamam anladım. "Bir etki alanı, temel olarak, isteğe bağlı kısıtlamaları olan bir veri türüdür (izin verilen değerler kümesinde kısıtlamalar)." - Faheem Mitha
Gerçekten istediğim şeyin farkına varmam biraz zaman aldı. \dT+ my_enum;. - gylaz


Şuna göz at:

select enum_range(null::my_type)

Bence bu daha basit bir çözümdür :).


56
2017-08-15 13:02



Bunu sadeliği için seviyorum. En çok oy alan her şekilde çalışıyor ... ama bu da var. :) - PRS
Bunu beğendim. \ D sözdizimi dbeaver veya pgadmin'de çalışmadı, ancak taşınabilirde salt SQL - Darren
PostgreSQL 8.3.11'de çalışıyor - Yzmir Ramirez


Tam adın (tip adı ve şema) ve hepsinin sıralı bir listesini istiyorsanız enum etiketler, bu sorgu yapacağız:

SELECT n.nspname AS "schema", t.typname
     , string_agg(e.enumlabel, '|' ORDER BY e.enumsortorder) AS enum_labels
FROM   pg_catalog.pg_type t 
JOIN   pg_catalog.pg_namespace n ON n.oid = t.typnamespace 
JOIN   pg_catalog.pg_enum e ON t.oid = e.enumtypid  
WHERE  t.typname = 'my_enum_type'
GROUP  BY 1,2;

İade:

 schema | typname      | enum_labels
--------+--------------+-------------
 public | my_enum_type | foo|bar

string_agg() Postgres 9.0 veya üstü gerektirir, ile değiştirin array_agg() eski versiyonlar için.


SQL'i almak için CREATE deyim kullanabilirsin pg_dump ve döküm dosyasına bakın.

Ya da, daha pratik olarak, pgAdmin Hangi ters mühendislik SQL gösterir veritabanındaki herhangi bir nesne için komut dosyaları oluşturun. İçinde seç object browser ve onun oluşturma betiği SQL pane. Komut dosyasını yeni açılan bir pencereye kopyalamak için bir seçenek bile var. SQL editor otomatik olarak düzenleyebilir ve çalıştırabilirsiniz.


12
2018-03-04 21:19



İçinde görüntüleme türlerini etkinleştirmeniz gerektiğini unutmayın. pgAdmin varsayılan olarak: Dosya → Seçenek → Tarayıcı ve kontrol etme Types. - Eugene Yarmash
aslında 1.18.1 sürümünden bu seçeneği Dosya -> Seçenekler -> Ekran'da bulabilirsiniz. - Mohamad mehdi Kharatizadeh


SELECT t.typname
FROM pg_class c JOIN pg_attribute a ON c.oid = a.attrelid JOIN pg_type t ON a.atttypid = t.oid
WHERE c.relname = 'your_type';

Bu zor kısmı, bu görünümlerden * seçerek sonuçların OID'leri almamasıydı.


0
2018-03-02 16:03