psqlとは?PostgreSQLをコマンドラインで操作する基本コマンドと実践的な使い方

目次

psqlとは?PostgreSQL公式のコマンドラインツール

PostgreSQLを使い始めたけど、「psqlって何?」「pgAdminだけじゃダメなの?」と思ったことはありませんか?

psql(ピー・エス・キュー・エル)は、PostgreSQLに標準で付属する対話型のコマンドラインクライアントです。ターミナルやコマンドプロンプトからデータベースに接続し、SQLの実行やデータベースの管理ができます。

「対話型」というのは、コマンドを入力するとすぐに結果が返ってくるという意味です。まるでデータベースと会話しているような感覚で操作できます。

psqlの役割と特徴

psqlは単なるSQL実行ツールではありません。以下のような幅広い機能を備えています。

  • SQLの実行:SELECT、INSERT、UPDATE、DELETEなどのSQL文を直接入力して実行
  • メタコマンド\d\lなど、バックスラッシュで始まる独自コマンドでデータベースの情報を素早く確認
  • スクリプト実行:SQLファイルを読み込んで一括実行(バッチ処理の自動化)
  • データの入出力:CSVファイルのインポート・エクスポートにも対応

psqlはPostgreSQLをインストールすると自動的に一緒にインストールされるため、追加のセットアップは不要です。

pgAdminとの違い(CLI vs GUI)

PostgreSQLの操作ツールとしては、GUIベースのpgAdminも広く使われています。psqlとpgAdminはどちらもPostgreSQLを操作するためのツールですが、それぞれ得意な場面が異なります。

比較項目 psql(CLI) pgAdmin(GUI)
操作方法 コマンド入力 マウス+画面操作
学習コスト コマンドを覚える必要あり 直感的に操作可能
作業速度 慣れると非常に高速 複数クリックが必要
自動化 シェルスクリプトと連携可能 自動化には不向き
リモート操作 SSH接続で簡単に操作 別途設定が必要
データの可視化 テキスト表示のみ グラフやダッシュボードあり

結論として、開発・運用の現場ではpsqlが圧倒的に効率的です。特にサーバー上での作業やCI/CDパイプラインでの自動化では、psqlが事実上の標準ツールとなっています。

psqlを学ぶべき3つの理由

  1. 本番サーバーではGUIが使えない場面が多い:SSH経由でサーバーに接続してデータベースを確認する場合、psqlがほぼ唯一の選択肢です
  2. 作業の自動化に必須:バックアップやデータ移行、定期的なメンテナンスをスクリプト化するにはpsqlの知識が欠かせません
  3. トラブル対応が速くなる:障害発生時にGUIを立ち上げている余裕はありません。psqlなら即座にデータベースの状態を確認できます

psqlの環境準備と接続方法

PostgreSQLインストール時の確認ポイント

psqlはPostgreSQLのインストール時に同梱されています。ただし、Windows版のインストーラーで「Command Line Tools」のチェックを外してしまうと、psqlがインストールされないので注意が必要です。

psqlがインストールされているか確認するには、ターミナルで以下のコマンドを実行してください。

psql --version

バージョン情報が表示されれば、psqlは正常にインストールされています。

psql (PostgreSQL) 16.4

もしcommand not foundと表示された場合は、PostgreSQLのインストールを確認するか、PATHの設定を見直してください。

psqlの起動方法(Mac / Windows / Linux)

OSごとの起動方法は以下の通りです。

Mac(ターミナル):

# Homebrewでインストールした場合はそのまま実行可能
psql -U postgres

Windows(コマンドプロンプト):

# PATHが通っていない場合はフルパスで指定
"C:\Program Files\PostgreSQL\16\bin\psql.exe" -U postgres

# または「SQL Shell (psql)」をスタートメニューから起動

Linux(ターミナル):

# パッケージマネージャーでインストールした場合
sudo -u postgres psql

データベースへの接続コマンド

psqlの基本的な接続コマンドは以下の形式です。

psql -h ホスト名 -p ポート番号 -U ユーザー名 -d データベース名

各オプションの意味を見ていきましょう。

オプション 説明 デフォルト値
-h 接続先のホスト名またはIPアドレス localhost
-p ポート番号 5432
-U 接続ユーザー名 OSのログインユーザー名
-d 接続先データベース名 ユーザー名と同じ名前
-W パスワード入力を強制 必要時のみ要求

実際の接続例をいくつか紹介します。

# ローカルのデフォルトデータベースに接続
psql -U postgres

# 特定のデータベースに接続
psql -U postgres -d myapp_development

# リモートサーバーに接続
psql -h db.example.com -p 5432 -U admin -d production

# 接続URI形式(Supabaseなどのクラウドサービスで一般的)
psql "postgresql://user:password@host:5432/dbname?sslmode=require"

接続が成功すると、postgres=# のようなプロンプトが表示されます。#はスーパーユーザー、>は一般ユーザーを示しています。

接続エラーが出た時の対処法

psqlで接続しようとしたとき、エラーが出ることがあります。よくあるエラーとその対処法をまとめました。

エラー1:パスワード認証の失敗

psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: FATAL: password authentication failed for user "postgres"

対処法:パスワードが正しいか確認してください。インストール時に設定したパスワードを忘れた場合は、pg_hba.confファイルの認証方式を一時的にtrustに変更してパスワードをリセットできます。

エラー2:サーバーに接続できない

psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused
        Is the server running on that host and accepting TCP/IP connections?

対処法:PostgreSQLサーバーが起動しているか確認しましょう。

# macOS(Homebrew)
brew services list | grep postgresql

# Linux(systemd)
sudo systemctl status postgresql

# サーバーを起動する場合
# macOS
brew services start postgresql@16
# Linux
sudo systemctl start postgresql

エラー3:データベースが存在しない

psql: error: FATAL: database "myuser" does not exist

対処法:-dオプションでデータベース名を明示的に指定してください。デフォルトではユーザー名と同じ名前のデータベースに接続しようとします。

# まずpostgresデータベースに接続
psql -U postgres -d postgres

覚えておきたいpsqlメタコマンド一覧

psqlの最大の特徴がメタコマンドです。バックスラッシュ(\)で始まるpsql独自のコマンドで、SQLを書かなくてもデータベースの情報を素早く確認できます。

データベース操作

コマンド 説明 使用例
\l データベース一覧を表示 どんなDBがあるか確認
\c データベース名 指定のデータベースに切り替え \c myapp_dev
\conninfo 現在の接続情報を表示 接続先の確認に便利
\q psqlを終了 セッションを終了する

実際の操作例を見てみましょう。

-- データベース一覧の表示
postgres=# \l
                                  List of databases
      Name      |  Owner   | Encoding |   Collate   |    Ctype    
----------------+----------+----------+-------------+-------------
 myapp_dev      | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8
 myapp_test     | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8
 postgres       | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8

-- データベースの切り替え
postgres=# \c myapp_dev
You are now connected to database "myapp_dev" as user "postgres".
myapp_dev=#

テーブル操作

コマンド 説明 使用例
\dt テーブル一覧を表示 DBにどんなテーブルがあるか確認
\d テーブル名 テーブルの構造を表示 \d users でカラム情報を確認
\di インデックス一覧を表示 パフォーマンス調査に
\dv ビュー一覧を表示 ビューの確認
\df 関数一覧を表示 カスタム関数の確認
\du ユーザー(ロール)一覧を表示 権限の確認に
-- テーブル一覧の表示
myapp_dev=# \dt
          List of relations
 Schema |   Name   | Type  |  Owner   
--------+----------+-------+----------
 public | users    | table | postgres
 public | orders   | table | postgres
 public | products | table | postgres

-- テーブル構造の表示
myapp_dev=# \d users
                                     Table "public.users"
   Column   |          Type          | Collation | Nullable |              Default              
------------+------------------------+-----------+----------+-----------------------------------
 id         | integer                |           | not null | nextval('users_id_seq'::regclass)
 name       | character varying(100) |           | not null | 
 email      | character varying(255) |           | not null | 
 created_at | timestamp              |           |          | CURRENT_TIMESTAMP

表示・出力制御

クエリ結果の表示方法を変更するコマンドも覚えておくと便利です。

コマンド 説明 活用場面
\x 拡張表示のON/OFF切り替え カラム数が多いテーブルの確認
\timing クエリ実行時間の表示ON/OFF パフォーマンス計測
\pset format 出力形式の変更(html, csv等) レポート作成
\o ファイル名 クエリ結果をファイルに出力 結果の保存
-- 拡張表示をONにする(カラムが多いテーブルで便利)
myapp_dev=# \x
Expanded display is on.

myapp_dev=# SELECT * FROM users WHERE id = 1;
-[ RECORD 1 ]-------------------
id         | 1
name       | 佐藤太郎
email      | sato@example.com
created_at | 2024-01-15 09:30:00

-- クエリの実行時間を計測
myapp_dev=# \timing
Timing is on.

myapp_dev=# SELECT COUNT(*) FROM orders;
 count 
-------
 15234
(1 row)

Time: 12.345 ms

その他の便利コマンド

コマンド 説明 活用場面
\i ファイル名 SQLファイルを読み込んで実行 マイグレーションの実行
\! コマンド OSのコマンドを実行 psqlを抜けずにファイル確認
\? メタコマンドのヘルプを表示 コマンドを忘れた時
\h SQL文 SQL文の構文ヘルプを表示 \h CREATE TABLE
\e エディタでクエリを編集 長いSQLを書く時

psqlで実行するSQL基本操作

psqlに接続できたら、実際にSQLを実行してデータベースを操作してみましょう。ここでは、開発でよく使う基本操作を紹介します。

データベースとテーブルの作成

-- データベースの作成
CREATE DATABASE myapp_development;

-- 作成したデータベースに切り替え
\c myapp_development

-- テーブルの作成
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    age INTEGER,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- テーブルが作成されたか確認
\dt

SERIALはPostgreSQLの自動採番型で、レコードを追加するたびにidが自動的にインクリメントされます。

データの挿入・取得・更新・削除(CRUD)

-- INSERT:データの挿入
INSERT INTO users (name, email, age) VALUES ('佐藤太郎', 'sato@example.com', 28);
INSERT INTO users (name, email, age) VALUES ('鈴木花子', 'suzuki@example.com', 32);
INSERT INTO users (name, email, age) VALUES ('田中一郎', 'tanaka@example.com', 25);

-- SELECT:データの取得
SELECT * FROM users;

-- 条件付き取得
SELECT name, email FROM users WHERE age >= 28;

-- UPDATE:データの更新
UPDATE users SET age = 29 WHERE name = '佐藤太郎';

-- DELETE:データの削除
DELETE FROM users WHERE id = 3;

-- 削除後の確認
SELECT * FROM users;

psqlでは、SQLの末尾に必ずセミコロン(;)を付ける必要があります。セミコロンを忘れると、psqlは「まだ入力が続く」と判断し、プロンプトが-#に変わります。その場合は;を入力してEnterを押せばSQLが実行されます。

SQLファイルの実行(バッチ処理)

あらかじめ用意したSQLファイルをpsqlで一括実行できます。マイグレーションやシードデータの投入で重宝します。

# psqlの外から実行する方法
psql -U postgres -d myapp_development -f setup.sql

# psqlの中から実行する方法
myapp_development=# \i /path/to/setup.sql

-fオプションを使えば、psqlに接続すると同時にSQLファイルを実行し、完了後に自動終了します。スクリプトやCI/CDパイプラインでの利用に最適です。

実務で使えるpsql活用テクニック

基本操作を覚えたら、実務で役立つ便利なテクニックも押さえておきましょう。

.pgpassファイルでパスワード入力を省略

毎回パスワードを入力するのは面倒ですよね。.pgpassファイルを作成すれば、パスワードの自動入力が可能です。

# .pgpassファイルの作成(Mac / Linux)
touch ~/.pgpass
chmod 600 ~/.pgpass

ファイルの中身は以下の形式で記述します。

# ホスト名:ポート:データベース名:ユーザー名:パスワード
localhost:5432:myapp_development:postgres:mypassword
db.example.com:5432:production:admin:secretpassword

# ワイルドカードも使用可能
localhost:5432:*:postgres:mypassword

セキュリティ上の注意.pgpassファイルのパーミッションは必ず600に設定してください。他のユーザーから読めるとpsqlはこのファイルを無視します。

psqlrcでプロンプトをカスタマイズ

~/.psqlrcファイルを作成すると、psql起動時に自動で読み込まれる設定を定義できます。

-- ~/.psqlrc の設定例

-- プロンプトにデータベース名とユーザー名を表示
\set PROMPT1 '%n@%/%R%# '

-- NULLを視覚的に分かりやすく表示
\pset null '(NULL)'

-- クエリの実行時間を常に表示
\timing

-- 自動補完を大文字小文字を無視して実行
\set COMP_KEYWORD_CASE upper

-- ヒストリ(履歴)の重複を除外
\set HISTCONTROL ignoredups

この設定をしておくと、NULLが空白で表示されて見落とすといったミスを防げます。

CSVエクスポート・インポート(\copy)

psqlの\copyコマンドを使えば、データのCSV出力・取り込みが簡単にできます。

-- テーブルのデータをCSVファイルにエクスポート
\copy users TO '/tmp/users_export.csv' WITH CSV HEADER

-- CSVファイルからテーブルにインポート
\copy users (name, email, age) FROM '/tmp/users_import.csv' WITH CSV HEADER

-- 特定の条件のデータだけエクスポート
\copy (SELECT name, email FROM users WHERE age >= 30) TO '/tmp/senior_users.csv' WITH CSV HEADER

\copyはクライアント側で実行されるため、サーバー側のCOPYコマンドと違ってスーパーユーザー権限が不要です。開発環境でのデータ確認やテストデータの準備に便利です。

まとめ:psqlで効率的にPostgreSQLを操作しよう

この記事では、PostgreSQL公式のコマンドラインツールであるpsqlの基本から実践的な活用法までを解説しました。

改めてポイントを整理すると、psqlはPostgreSQLに標準付属する対話型CLIツールであり、データベースへの接続はpsql -U ユーザー名 -d データベース名が基本形です。\l\dt\dなどのメタコマンドを活用することでSQLを書かずに素早くDB情報を確認でき、.pgpass.psqlrcの設定で日常業務を大幅に効率化できます。

まずはローカル環境でpsqlに接続して、メタコマンドをいくつか試してみてください。GUIツールでは得られないスピード感を実感できるはずです。

psqlの知識をさらに活用する関連記事

psqlの基本を習得したら、データベース環境やツール周りの知識も強化して、より効果的な開発環境を構築しましょう。

データベース・インフラ

開発効率化ツール

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次