PostgreSQL 7 min read

PostgreSQLでデータベース一覧を表示する ― \lとpg_database、切り替えは\c

PostgreSQL には MySQL の SHOW DATABASES に当たる SQL がありません。この記事の出力は PostgreSQL 17.6 で採りました。

まず見る(結論)

  • psql の中なら \l。サイズも見るなら \l+
  • シェルから1行で出すなら psql -U postgres -l
  • SQL なら SELECT datname FROM pg_database WHERE NOT datistemplate;
  • 別のデータベースに移るのは \c データベース名(USE は無い)

\l で表示する

\l
                                                    List of databases
   Name    |  Owner   | Encoding | Locale Provider |  Collate   |   Ctype    | Locale | ICU Rules |   Access privileges
-----------+----------+----------+-----------------+------------+------------+--------+-----------+-----------------------
 postgres  | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           |
 sugdb     | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           |
 template0 | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | =c/postgres          +
           |          |          |                 |            |            |        |           | postgres=CTc/postgres
 template1 | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | =c/postgres          +
           |          |          |                 |            |            |        |           | postgres=CTc/postgres
(4 rows)

自分で作っていなくても、postgres、template0、template1 の3つは最初からあります。

  • postgres: 接続先を指定しないときなどに使う既定のデータベース。空でもよい
  • template1: CREATE DATABASE のコピー元。ここに作った表や拡張は、以後に作るデータベースにも入る
  • template0: 初期状態のまま変えないためのテンプレート。接続もできない

3つとも削除しないでください。

\l+ にするとサイズ、表スペース、説明の列が増えます。

\l+
   Name    |  Owner   | ... |  Size   | Tablespace | Description
-----------+----------+-----+---------+------------+-------------
 sugdb     | postgres | ... | 7779 kB | pg_default |

(列を一部省略し、sugdb の行だけを示しています)

シェルから出す

psql に入らずに一覧だけ欲しいときは -l を付けます。出力は \l と同じです。

$ psql -U postgres -l

スクリプトで名前だけ取るなら、-At(整列なし・見出しなし)で SQL を流す方が扱いやすくなります。

$ psql -U postgres -At -c "SELECT datname FROM pg_database WHERE NOT datistemplate"

SQL で一覧とサイズを取る

SELECT datname, pg_size_pretty(pg_database_size(datname))
  FROM pg_database
 WHERE NOT datistemplate;
 datname  | pg_size_pretty
----------+----------------
 postgres | 7507 kB
 sugdb    | 7779 kB
(2 rows)

WHERE NOT datistemplate で template0 と template1 を除いています。表がほとんど無いデータベースでも 7MB 台あるのは、システムカタログの分です。

データベースを切り替える

PostgreSQL では、1つの接続は1つのデータベースにしかつながりません。MySQL の USE は無く、psql の \c で接続し直します。

\c sugdb
You are now connected to database "sugdb" as user "postgres".

SELECT current_database();
 current_database
------------------
 sugdb
(1 row)

別のデータベースの表を、同じ SQL の中で sugdb.public.customers のように参照することもできません。データベースをまたいで結合したいなら、1つのデータベースの中でスキーマを分ける構成にします。

表の一覧は PostgreSQLでテーブル一覧を表示する にまとめています。