HOWTO · PostgreSQL
PSQL での PostgreSQL クエリの実行
この記事では、PostgreSQL コマンド ライン ツールからクエリを実行する方法について説明します。
このページの内容
psql は PostgreSQL のターミナルクライアントです。対話形式で SQL を実行したり、選択したデータベースにクエリを送信したり、.sql ファイル内の文を実行したりできます。pgAdmin とは異なり、psql はターミナルで動作し、SQL 文だけでなく独自のバックスラッシュコマンドも受け付けます。以下の例は、PostgreSQL サーバーに接続でき、選択したデータベースへの接続権限を持つロールがあることを前提としています。
対話型 psql セッションで SQL 文を実行する
psql -U postgres -d postgres を実行して対話型セッションを開始します。postgres は、使用中の環境で利用できるロール名とデータベース名に置き換えてください。プロンプトで SQL 文を入力し、末尾にセミコロンを付けて完了します。次の一時テーブルの例は、同じセッション内で繰り返し実行できます。2行を挿入する前にセッション内の例用テーブルを空にするため、実行するたびに表示結果が同じになります。
CREATE TEMP TABLE IF NOT EXISTS bag (id integer PRIMARY KEY, model text NOT NULL);
TRUNCATE bag;
INSERT INTO bag (id, model) VALUES (1, 'Adidas'), (2, 'Jale') ON CONFLICT (id) DO UPDATE SET model = EXCLUDED.model;
SELECT id, model FROM bag ORDER BY id;
SELECT の結果には、次の列と行が含まれます。
| id | model |
|---|---|
| 1 | Adidas |
| 2 | Jale |
対話型セッションで Enter キーを押すと次の入力行に進みますが、それだけで SQL 文が完了するわけではありません。文末にセミコロンがない場合、psql は入力を受け付け続け、通常は継続入力用のプロンプトを表示します。セミコロンを追加すると文が完了します。誤った文を入力し始めた場合は、\r でクエリバッファをクリアして、最初から入力し直せます。最初の文を終える前に別のコマンドを続けて入力すると、psql は入力全体を1つの SQL 文として扱うため、構文エラーになることがあります。
対象データベースに接続してクエリを実行する
自分のロールから参照できるデータベースを \l または \l+ で一覧表示できます(\l+ では追加情報も表示されます)。PostgreSQL のカタログを SELECT datname FROM pg_database ORDER BY datname; で照会する方法もあります。カタログにはデータベースが一覧表示されますが、ロールが接続できるかどうかは権限とサーバーの設定によります。
psql 内で \c postgres を実行してデータベースに接続します。postgres は対象のデータベース名に置き換えてください。\dt は現在の検索パスにあるテーブルを一覧表示します。ほかのリレーション種別を調べるには \d を使います。これにより、ビュー、シーケンス、その他の対応するリレーション種別も一覧表示されます。起動時に接続先を指定するには、-d オプションを使います。例: psql -U postgres -d postgres。
-c を使うと、クエリを渡して実行できます。例: psql -U postgres -d postgres -c "SELECT datname FROM pg_database ORDER BY datname;"。このカタログクエリは新しい psql セッションで実行でき、先に作成したテーブルには依存しません。シェルによって引用符の規則は異なります。POSIX 互換シェルでは、二重引用符で SQL を1つのコマンドライン引数にまとめます。これはシェル構文であり、SQL の引用符ではありません。クエリに SQL の文字列リテラルが含まれる場合、シェルはその中の一重引用符を二重引用符で囲まれた引数内にそのまま渡します。PowerShell やコマンド プロンプトでは引用符やエスケープの規則が異なる場合があるため、使用するシェルに合わせてコマンドを調整してください。セミコロンは SQL 文を終わらせますが、-c に単一の文を渡す場合は末尾のセミコロンを省略できます。
単一行モードで1行のクエリを実行する
-S または --single-line を付けて psql を起動すると、単一行モードが有効になります。例: psql -U postgres -d postgres -S。このモードでは改行すると現在の入力行がクエリとして送信されるため、1行につき SQL 文を1つ入力します。たとえば、SELECT datname FROM pg_database ORDER BY datname と入力して Enter キーを押します。このモードは1行入力を想定しています。複数行にわたる SQL 文には、通常の対話型モードを使い、文末にセミコロンを付けてください。
psql でファイル内の SQL を実行する
クライアントの起動時に SQL ファイルを実行するには、psql -U postgres -d postgres -f "/path/to/query.sql" を使います。プレースホルダーを実際のファイルパスに置き換えてください。空白を含むパスは、使用するシェルの規則に従って引用符で囲みます。パス区切り文字もオペレーティングシステムとシェルによって異なります。
起動済みの対話型セッションでは、\i '/path/to/query.sql' を実行すると同じファイルを読み込めます。ファイルは psql が動作している環境から読み取り可能である必要があります。どちらの方法でも、ファイル内の SQL は選択したデータベースに送られます。データを変更する文を実行する前に、接続先データベースとロールを確認してください。