Bagaimana cara mendaftar semua database dan tabel menggunakan psql?

1171

Saya mencoba mempelajari administrasi PostgreSQL dan sudah mulai belajar bagaimana menggunakan psqlalat baris perintah.

Ketika saya masuk dengan psql --username=postgres, bagaimana cara mendaftar semua database dan tabel?

Saya telah mencoba \d, ddan dS+tapi tidak terdaftar. Saya telah membuat dua database dan beberapa tabel dengan pgAdmin III, jadi saya tahu mereka harus terdaftar.

Jonas
sumber
1
Jika Anda ingin mengaksesnya melalui baris perintah, jalankanpsql -l
adriaan
Komentar ini pastinya menjadi salah satu jawaban teratas! Jika Anda membutuhkan auth Anda juga bisa psql --username=postgres -l.
Ulysse BN

Jawaban:

1544

Harap perhatikan perintah berikut:

  • \listatau \l: daftar semua basis data
  • \dt: daftar semua tabel di database saat ini

Anda tidak akan pernah melihat tabel di database lain, tabel ini tidak terlihat. Anda harus terhubung ke database yang benar untuk melihat tabelnya (dan objek lainnya).

Untuk berpindah basis data:

\connect database_name atau \c database_name

Lihat manual tentang psql .

Frank Heikens
sumber
131
Anda dapat menggunakan \c db_nameuntuk terhubung ke database tertentu.
eikes
17
\dttampaknya tidak mencantumkan semua tabel dalam database saat ini (tampaknya mengecualikan yang tidak ditemukan search_pathpada setidaknya pada 9,2)
Jack Douglas
22
\dt *.akan mencantumkan semua tabel di semua skema, tanpa harus mengubah jalur pencarian Anda.
danpelota
19
\ l + adalah favorit saya - ini menunjukkan penggunaan disk juga.
Lester Cheung
1
Pada Windows saya bisa daftar database dengan perintah ini psql -U username -ltetapi tidak berfungsi dengan versi slash.
NoNameProvided
350

Ini daftar basis data:

SELECT datname FROM pg_database
WHERE datistemplate = false;

Ini daftar tabel dalam database saat ini

SELECT table_schema,table_name
FROM information_schema.tables
ORDER BY table_schema,table_name;
RolandoMySQLDBA
sumber
11
Anda benar, tetapi pertanyaannya adalah tentang meta-perintah dari alat psql. \ dt jauh lebih mudah daripada mengetik kueri apa pun.
Frank Heikens
19
Saya pikir ini adalah jawaban yang HEBAT karena itu dapat dieksekusi dari baris perintah Linux sebagai lawan dari perlu berada di interpreter psql yang kadang-kadang hang untuk saya menggunakan ExtraPutty.
Cinta dan kedamaian - Joe Codeswell
2
Juga menyelamatkan hariku. Untuk kasus khusus saya, saya menambahkan WHERE table_schema = 'public'karena saya ingin menjatuhkan hanya tabel kustom.
Renra
29
Jika Anda memulai psql dengan tanda -E, itu akan menampilkan permintaan nyata ketika Anda menggunakan perintah-meta.
Deebster
Ini jawaban yang bagus. Meskipun OP menginginkan metacommand, saya mencari Google untuk ini, dan itu mengarahkan saya ke pertanyaan ini.
Membuang Akun
109

Dalam Postgresql, perintah terminal ini mencantumkan basis data yang tersedia

el@defiant$ /bin/psql -h localhost --username=pgadmin --list

Atau perintah yang dinyatakan lebih sederhana:

psql -U pgadmin -l

Perintah-perintah itu mencetak ini di terminal:

                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 kurz_prod | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 pgadmin   | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

Ini adalah basis data yang tersedia.

Dalam PSQL perintah ini mencantumkan tabel yang tersedia

Anda harus menentukan database sebelum Anda bisa daftar tabel di database itu.

el@defiant$ psql -U pgadmin -d kurz_prod

Ini membawa Anda ke terminal psql:

kurz_prod=#

Gunakan perintah \dartinya tampilkan semua tabel, tampilan, dan urutan

kurz_prod=# \d

Ini mencetak:

           List of relations
Schema |  Name   |   Type   |  Owner
--------+---------+----------+---------
public | mytable | table    | pgadmin
public | testing | sequence | pgadmin
(2 rows)

Kemudian, untuk keluar dari terminal psql, ketik \qdan tekan enter. Atau Ctrl-Dmelakukan hal yang sama. Ini adalah tabel dalam database itu.

Eric Leschinski
sumber
4
tidak hanya mencantumkan tabel:\d[S+] list tables, views, and sequences
Jack Douglas
3
Bagi saya, ini adalah jawaban yang "benar" karena tidak mengharuskan Anda sudah terhubung ke database yang ada.
aardvarkk
71

\ljuga merupakan singkatan \list. Ada beberapa perintah slash, yang bisa Anda daftarkan dalam psql dengan menggunakan \?.

Derek Arnold
sumber
35

Untuk mendapatkan lebih banyak informasi tentang database dan daftar tabel, Anda dapat melakukan:

\l+ untuk membuat daftar basis data

                                                                    List of databases
    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   |  Size   | Tablespace |                Description
------------+----------+----------+-------------+-------------+-----------------------+---------+------------+--------------------------------------------
 pgbench    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 29 MB   | pg_default |
 postgres   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 6073 kB | pg_default | default administrative connection database
 slonmaster | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 1401 MB | movespace  |
 slonslave  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 32 MB   | pg_default |
 template0  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 5785 kB | pg_default | unmodifiable empty database
            |          |          |             |             | postgres=CTc/postgres |         |            |
 template1  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 5985 kB | pg_default | default template for new databases
            |          |          |             |             | postgres=CTc/postgres |         |            |
 test       | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 13 MB   | pg_default |
(7 rows)

dan

\d+ untuk membuat daftar semua tabel dalam skema search_path saat ini di database saat ini.

test=# \dn+ --list schemas
                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description       
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres+| standard public schema
        |          | =UC/postgres         | 
schema1 | postgres | postgres=UC/postgres+| 
        |          | =UC/postgres         | 
(2 row)

test=# set search_path to schema1, public;
SET
test=# \d+
                                  List of relations
     Schema  |      Name       | Type  |    Owner     |    Size    | Description
    ---------+-----------------+-------+--------------+------------+-------------
     public  | all_units       | table | postgres     | 0 bytes    |
     public  | asset           | table | postgres     | 16 kB      |
     public  | asset_attribute | table | postgres     | 8192 bytes |
     public  | food            | table | postgres     | 48 kB      |
     public  | name_log        | table | postgres     | 8192 bytes |
     public  | outable         | table | ordinaryuser | 0 bytes    |
     public  | outable2        | table | ordinaryuser | 0 bytes    |
     public  | test            | table | postgres     | 16 kB      |
     public  | usr             | table | postgres     | 5008 kB    |
     schema1 | t1              | table | postgres     | 0 bytes    |
    (10 rows)
Soni Harriz
sumber
33

Dari pg_Admin Anda cukup menjalankan yang berikut ini di database Anda saat ini dan itu akan mendapatkan semua tabel untuk skema yang ditentukan:

SELECT * 
FROM information_schema.tables 
WHERE table_type = 'BASE TABLE' 
    AND table_schema = 'public' 
ORDER BY table_type, table_name

Ini akan memberi Anda daftar semua tabel permanen (umumnya tabel yang Anda cari). Anda bisa mendapatkan hanya nama tabel jika Anda mengubah *wildcard menjadi hanya table_name. Publik table_schemaadalah skema default untuk sebagian besar basis data kecuali admin Anda telah membuat skema baru.

Larry W
sumber
3
Meskipun ini benar, ini membahas klien yang berbeda dari yang ditanyakan OP.
dezso
Ini bekerja sangat baik untuk saya, dan meskipun use case saya tidak persis seperti yang diminta OP, itu membantu saya mendapatkan daftar tabel saat terhubung melalui pembungkus (dalam Julialang LibPQ.jl )
Vass
19

Ada kemungkinan bahwa Anda telah memasukkan tabel ke dalam skema yang tidak ada di jalur pencarian Anda, atau default, yaitu publik dan sehingga tabel tidak akan muncul menggunakan \ dt. Jika Anda menggunakan skema yang disebut, katakanlah, data, Anda dapat memperbaikinya dengan menjalankan,

alter database <databasename> set search_path=data, public;

Keluar dan masukkan kembali psql dan sekarang \ dt akan menunjukkan kepada Anda tabel dalam data skema juga.

John Powell
sumber
1
Yah, cara sederhana set search_path=data, public;juga bisa membantu :)
dezso
@dezso, apakah itu membuat perubahan secara permanen, atau hanya di sesi psql itu?
John Powell
Err, saya tidak begitu jelas. Itu dimaksudkan sebagai ganti siklus logout-login.
dezso