【PostgreSQL】psqlでのデータベース操作
PostgreSQLのCUIツールであるpsqlは、データベースを効率的に操作するための非常に強力な手段です。本記事ではCUI初心者やPostgreSQLの学習を始めたばかりの方を対象に、psqlの基本的な使い方や具体的なコマンド例を紹介します。
psqlとは
psqlは、PostgreSQLのCUI(文字ベースのユーザーインターフェース)ツールで、SQLコマンドを実行してデータベースを管理したり操作したりするために使用されます。軽量で高速、スクリプト化が可能という利点があり、PostgreSQLを効率よく操作するのに欠かせないツールです。
SQLコマンドの分類
SQLはRDBMSに対する標準の「問い合わせ言語」です。標準を完全に準拠しているRDBMSはありませんがPostgreSQLは下記の主要な部分に準拠しています。
- DDL(Data Definition Language)
 データベースのテーブル等のオブジェクトを定義・変更します。- 主なコマンド
- CREATE
- ALTER
- DROP
 
 
- 主なコマンド
- DML(Data Manipulation Language)
 データベース内のデータを操作します。データの挿入/追加/削除等を行います。- 主なコマンド
- SELECT
- INSERT
- UPDATE
- DELETE
 
 
- 主なコマンド
- DCL(Data Control Language)
 データベースへのアクセス権限を制御します。トランザクション関連のコマンドも含まれます。
SQLコマンドの詳細は下記ブログを参照ください。
【参考ブログ】:データベースカテゴリ「PosygreSQL」
GUIとCUIの比較
PostgreSQLを操作するには、GUI(Graphical User Interface)とCUI(Character User Interface)の2つの方法があります。それぞれのメリットとデメリットを確認してみましょう。
GUI(pgAdmin4等)
- メリット
- 視覚的にデータを確認しやすい
- ボタン操作で機能を利用できるため初心者でも扱いやすい
- ER図やスキーマデザインツールなど、視覚化ツールが豊富
 
- デメリット
- 動作が重くなることがある
- 複雑な操作では効率が悪い場合がある
- CLIツール1に比べてスクリプトの自動化が難しい
 
CUI(例: psql等)
- メリット
- 軽量で高速に操作可能
- シェルスクリプトと組み合わせて操作を自動化できる
- ネットワーク経由でリモートのPostgreSQLに直接アクセス可能
 
- デメリット
- 初心者にとってはコマンドを覚える必要がある
- データの視覚化ができない
- GUIと比較して操作ミスが生じやすい
 
psqlの起動方法
代表的な2つの方法を紹介します。
スタートメニューからの起動
SQL Shell(psql)をクリックするとコマンドプロンプトが起動し、
①Server 
②Database名 
③Port番号 
④Username 
⑤Client Encording [SJIS]
を聞いてくるので適宜入力します。本例ではデータベース名以外はEnterを押下してでデフォルトを使用しています。接続が確立すると下図のように、接続プロンプト「sales_db=#」が表示されます。プロンプトの「=#」はスーパーユーザーで接続している事を示し、「=>」は一般ユーザーを示します。


ユーザー名とデータベース名を指定して起動
コマンドプロンプトから下図のように入力して接続します。このとき、ユーザー名にログイン属性が付与されていないとエラーメッセージが表示されて接続できません。
コマンド例):「psql -U ユーザー名 -d データベース名」 又は、「psql ユーザー名 データベース名」

psqlの基本コマンド
psqlコマンドオプション
psqlコマンドには様々なオプションを指定できます。ここでは、利用可能なオプションのいくつかを紹介します。
- -l
 データベースの一覧を表示する

- -C ’コマンド’
 引数で指定したコマンドを実行し結果を表示する
- -f ファイ名
 引数で指定したファイルの内容をSQLとして実行する
- -h ホスト名
 接続するPostgreSQLのホスト名を指定する
データベース接続後のバックスラッシュコマンド
データベース内のテーブルやインデックス等のオブジェクトを参照できるコマンドです。以下に例をし示します。
- \d
 テーブル/インデックス/シーケンス/ビューの一覧を表示する

■バックスラッシュコマンド一覧
| № | コマンド | 機 能 | 
|---|---|---|
| 1 | \c | データベースの接続を変更する。 | 
| 2 | \d | テーブル、ビュー、シーケンス、インデックスなどの詳細を表示する。 | 
| 3 | \dt | テーブルの一覧を表示する。 | 
| 4 | \dv | ビューの一覧を表示する。 | 
| 5 | \di | インデックスの一覧を表示する。 | 
| 6 | \ds | シーケンスの一覧を表示する。 | 
| 7 | \df | 関数の一覧を表示する。 | 
| 8 | \dn | 名前空間(スキーマ)の一覧を表示する。 | 
| 9 | \l or \list | データベースの一覧を表示する。 | 
| 10 | \i | ファイルからSQLコマンドを読み込んで実行する。 | 
| 11 | \g | 現在のクエリを実行する。 | 
| 12 | \q | psqlを終了する。 | 
| 13 | \? | psqlのヘルプを表示する。 | 
| 14 | \timing | コマンドの実行時間を表示する。 | 
| 15 | \x | 拡張表示モードの切り替え。 | 
psqlでSQLコマンドを実行する
先ずデータベースへ接続しテーブルの一覧を表示します。
C:\>psql sales_db postgres
psql (16.4)
"help"でヘルプを表示します。
sales_db=> \dt
              リレーション一覧
 スキーマ |    名前    |  タイプ  |  所有者
----------+------------+----------+----------
 public   | books      | テーブル | postgres
 public   | bookstock  | テーブル | postgres
 public   | customers  | テーブル | postgres
 public   | customers2 | テーブル | postgres
 public   | customers3 | テーブル | postgres
 public   | sales      | テーブル | postgres
(6 行)
sales_db=>booksテーブルの構造と内容を参照してみます。3件のレコードが格納されているのが分かります。
sales_db=> \d books
                                            テーブル"public.books"
     列     |           タイプ            | 照合順序 | Null 値を許容 |               デフォルト
------------+-----------------------------+----------+---------------+----------------------------------------
 book_id    | integer                     |          | not null      | nextval('books_book_id_seq'::regclass)
 title      | character varying(150)      |          | not null      |
 author     | character varying(100)      |          |               |
 price      | numeric(10,2)               |          | not null      |
 stock      | integer                     |          |               | 0
 created_at | timestamp without time zone |          |               | now()
インデックス:
    "books_pkey" PRIMARY KEY, btree (book_id)
sales_db=> SELECT * FROM books;
 book_id |       title       |  author   |  price  | stock |         created_at
---------+-------------------+-----------+---------+-------+----------------------------
       1 | PostgreSQL入門    | 鈴木 一郎 | 3000.00 |     2 | 2024-12-06 20:28:10.549144
       3 | A5:SQL Mk-2の基礎 | 松原 正和 | 2800.00 |    10 | 2024-12-06 20:28:10.549144
       6 | Python入門        | 田中 正   | 2500.00 |     5 | 2024-12-07 12:34:40.646229
(3 行)
sales_db=>booksテーブルに1件のレコードを追加します。「books_id 9 psqlの基礎」が追加されました。
sales_db=# INSERT INTO public.books (
sales_db(# title, author, price, stock) VALUES (
sales_db(# 'psqlの基礎'::character varying, '山田 正'::character varying, '2600'::numeric, '5'::integer)
sales_db-#  returning book_id;
 book_id
---------
       9
(1 行)
INSERT 0 1
sales_db=# SELECT * FROM books;
 book_id |       title       |  author   |  price  | stock |         created_at
---------+-------------------+-----------+---------+-------+----------------------------
       1 | PostgreSQL入門    | 鈴木 一郎 | 3000.00 |     2 | 2024-12-06 20:28:10.549144
       3 | A5:SQL Mk-2の基礎 | 松原 正和 | 2800.00 |    10 | 2024-12-06 20:28:10.549144
       6 | Python入門        | 田中 正   | 2500.00 |     5 | 2024-12-07 12:34:40.646229
       9 | psqlの基礎        | 山田 正  | 2600.00 |     5 | 2024-12-28 14:29:00.135625
(4 行)
sales_db=#以上のように、psqlでバックスラッシュコマンドやSQLコマンドを使用できれば、GUIに比べ短時間で操作ができるようになります。
- CLI:(Command Line Interface ツール)は、コマンドラインインターフェイス上で動作するソフトウェアやツールのことを指します。 ↩︎
まとめ
各種コマンドを覚えてしまえば、psqlを使用した方が作業効率は格段に向上します。しかし誤りやすい面もあるので慎重に使用する必要があります。
頻繁にPostgreSQLを使用するならば、簡単なコマンドを徐々に覚えてpsqlを使用してみてはどうでしょうか? 業務効率は格段に向上していく筈です。

 
  
  
  
  
