Psql tüm tabloları listele


125

liferayPostgreSQL kurulumumda veritabanındaki tüm tabloları listelemek istiyorum . Bunu nasıl yaparım?

Ben yürütmek istiyorum SELECT * FROM applications;içinde liferayveritabanı. applicationsbenim liferay db'deki bir tablodur. Bu nasıl yapılır?

İşte tüm veritabanlarımın bir listesi:

postgres=# \list
                              List of databases
Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
 -----------+----------+----------+-------------+-------------+-----------------------
 liferay   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/postgres         +
           |          |          |             |             | postgres=CTc/postgres+
           |          |          |             |             | liferay=CTc/postgres
 lportal   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 postgres  | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 template0 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

postgres=# 

Yanıtlar:


203

Tüm tabloları listelemek isterseniz , şunları kullanmalısınız:

\dt *.*

tüm şemalardaki tüm tabloları istediğinizi belirtmek için . Bu pg_catalog, içindeki tabloları, sistem tablolarını ve içindeki tabloları içerecektir information_schema. "Tüm kullanıcı tanımlı şemalardaki tüm tablolar" demenin yerleşik bir yolu yoktur; ancak, search_pathçalıştırmadan önce ilgilendiğiniz tüm şemaların bir listesine ayarlayabilirsiniz \dt.

Bunu programlı olarak yapmak isteyebilirsiniz, bu durumda psqlters eğik çizgi komutları işi yapmaz. Burasıdır kurtarmaya gelir. Tabloları listelemek için:INFORMATION_SCHEMA

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

BTW, psqlbir ters eğik çizgi komutuna yanıt olarak ne yapıldığını görmek isterseniz psql, -Ebayrakla çalıştırın . Örneğin:

$ psql -E regress    
regress=# \list
********* QUERY **********
SELECT d.datname as "Name",
       pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
       pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
       d.datcollate as "Collate",
       d.datctype as "Ctype",
       pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
**************************

böylece veritabanlarının bir listesini aldığında psqlaradığını görebilirsiniz pg_catalog.pg_database. Benzer şekilde, belirli bir veritabanındaki tablolar için:

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;

INFORMATION_SCHEMAMümkün olduğunda Pg sistem katalogları yerine SQL standardını kullanmak tercih edilir , ancak bazen Pg'ye özgü bilgilere ihtiyaç duyarsınız. Bu gibi durumlarda, sistem kataloglarını doğrudan sorgulamanın bir sakıncası yoktur ve bunun psql -Enasıl yapılacağı konusunda yardımcı bir rehber olabilir.


information_schema.tablesbazı nedenlerden dolayı görünümler içerir. (PostgreSQL 9.2'de, neyse.)
jpmc26

@ jpmc26 Evet, ile table_type = 'VIEW', bu yüzden hariç tutmaları kolaydır. Genel olarak SQL, görünümleri mümkün olduğunca tablolarla aynı şekilde ele almaya çalışır.
Craig Ringer

94

Veritabanına bağlanın ve ardından tabloları listeleyin:

\c liferay
\dt

Ben böyle yaparım zaten.

İsterseniz bu iki komutu tek bir satırda birleştirebilirsiniz:

\c liferay \dt

2
Aslında \dt *.*tüm ilgi tablolarının search_path.
Craig Ringer

10

Yapabileceğiniz genel masaları görmek için

tabloları listeleme

\dt

tablo, görünüm ve erişim ayrıcalıklarını listeleme

\dp or \z

veya sadece tablo isimleri

select table_name from information_schema.tables where table_schema = 'public';

2

SQL Query'de şu kodu yazabilirsiniz:

select table_name from information_schema.tables where table_schema='YOUR_TABLE_SCHEME';

Tablo düzeninizi YOUR_TABLE_SCHEME ile değiştirin;

Misal:

select table_name from information_schema.tables where table_schema='eLearningProject';

Tüm şemayı ve tüm tabloları görmek için, where cümlesine gerek yoktur:

select table_name from information_schema.tables

1

Tek satırlık bir örnek

\dt schemaname.* 

senaryonuzda

\dt public.*

0

Tüm şemalarda tüm tablolara ihtiyacınız yoksa bu, otomasyon betiklerinde kullanılabilir:

  for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
      ...
  done

-3

\?Psql'de desteklenen tüm komutlar hakkında bilgi almak için yazabilirsiniz .

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.