PostgreSQL şemasındaki tabloları listeleme


329

Bir \dtpsql yaptığımda, sadece geçerli şemadaki tabloların bir listesini almak ( publicvarsayılan olarak).

Tüm şemalardaki veya belirli bir şemadaki tüm tabloların listesini nasıl alabilirim?

Yanıtlar:


505

Tüm şemalarda:

=> \dt *.*

Belirli bir şemada:

=> \dt public.*

Bazı kısıtlamalarla düzenli ifadeler kullanmak mümkündür

\dt (public|s).(s|t)
       List of relations
 Schema | Name | Type  | Owner 
--------+------+-------+-------
 public | s    | table | cpn
 public | t    | table | cpn
 s      | t    | table | cpn

Gelişmiş kullanıcılar, herhangi bir rakamla eşleşmek için karakter sınıfları gibi normal ifade gösterimlerini kullanabilirler, örneğin [0-9]. Bölüm 9.7.3 belirtilen tüm normal ifade Özel karakterler için, çalışma ., yukarıda belirtildiği gibi, bir ayırıcı olarak alınır *normal ifade gösterimde çevrilir .*, ?çevrilir .ve $tam anlamıyla eşleştirilir olan. Sen yazarak ihtiyaç olarak bu desen karakterleri taklit edebilir ?için ., (R+|)için R*, ya (R|)için R?. $normal ifadelerin olağan yorumlamasından farklı olarak, desen tüm adla eşleşmesi gerektiğinden, normal ifade karakteri olarak gerekli değildir (diğer bir deyişle,$, deseninize otomatik olarak eklenir). *Desenin sabitlenmesini istemiyorsanız başlangıçta ve / veya sonunda yazın . Çift tırnak içinde, tüm normal ifade özel karakterlerinin özel anlamlarını yitirdiğini ve kelimenin tam anlamıyla eşlendiğini unutmayın. Ayrıca, normal ifade özel karakterleri operatör adı örüntülerinde (yani, argümanında \do) tam anlamıyla eşleştirilir .


6
Basitçe \dteşdeğerdir \dt public.*, doğru mu?
Donmuş Alev

Örneğin, belirli bir şemadaki iki belirli tabloya ne dersiniz? Gibi \dt public.user_info, public.user_scopemi?
James M. Lay

Boşver, sadece \dt public.a; \dt public.b;bir satırda yapmak daha kolay .
James M. Lay

bu tür örtük .. Eğer \ dt sadece "genel" tablolar verirse, düzenli ifadeler yoluyla daha fazla bir şey beklemezsiniz ..
mehmet

1
@FrozenFlame Değil! Varsayılan olarak, içinde ne varsa onu gösterir search_pathve bu varsayılan değerdir "$user", public.*. Sonuç olarak, set search_path=s; \dtşemadaki tüm tabloları listeleyecektir s.
Lukas Juhrich

258

Tabloları aşağıdakilerden seçebilirsiniz: information_schema

SELECT * FROM information_schema.tables 
WHERE table_schema = 'public'

7
arayüzünüz kısayolları desteklemiyorsa çok yararlıdır. Teşekkürler.
Matt Bannert

1
Bu da güzel bir şey çünkü information_schema.tables 'dan table_schema, table_name,'% whatever% 'gibi table_name gibi bir şey yapabilirsiniz; tablonun hangi şemada yer aldığını bilmeniz gerekiyorsa. \ dt
Josh Brown

2
Teşekkür ederim, Amazon Redshift üzerinde çalışıyor ve \ dt (kabul edilen cevap) yok.
Carlos2W

2
Bu en genel olarak faydalı cevaptır. information_schema, SQL Standartlarında tanımlanmıştır ve çoğu veritabanında kullanılabilir
Davos

54

Alternatif olarak aşağıdakiler information_schemade kullanılabilir pg_tables:

select * from pg_tables where schemaname='public';

3
yalnızca tablo adının sonuçtaki sorgu olmasını istiyorsanızSELECT tablename FROM pg_tables WHERE schemaname = 'public';
Grant Humphries

Şemadaki information_schemaöğeleri listelememeyle ilgili bir izin sorunu bulundu public, ancak pg_tablesyöntem iyi çalıştı. Çok teşekkürler!
John Crawford

8

Gelecekte bununla karşılaşanlar için:

Birkaç şema için ilişkilerin bir listesini görmek istiyorsanız:

$psql mydatabase
mydatabase=# SET search_path TO public, usa;   #schema examples
SET
mydatabase=# \dt
              List of relations
 Schema |      Name       | Type  |  Owner
--------+-----------------+-------+----------
 public | counties        | table | postgres
 public | spatial_ref_sys | table | postgres
 public | states          | table | postgres
 public | us_cities       | table | postgres
 usa    | census2010      | table | postgres
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.