PostgreSQL 基礎講座 #1 PostgreSQL とは — 既定の DB になった理由、インストールと psql の最初の一歩
バックエンドを作っていると、データベースはいつの間にか PostgreSQL に決まっていることが多いはずです。フレームワークのドキュメントの例も、クラウドのマネージドサービスも、新しいオープンソースツールのサポート一覧の先頭も PostgreSQL です。このシリーズは、その「いつの間にか使っている」DB を土台からきちんと学ぶ基礎 9 回です。データ型と設計、結合、インデックスと実行計画、トランザクション、JSONB を経て権限とバックアップまで登り、続く実践 9 回では成長するサービスの DB 運用(コネクションプール、性能診断、VACUUM、レプリケーション)を扱います。SQL を初めて見る方よりは、「クエリは書くが DB を学んだことはない」開発者を読者として想定しています。
なぜ PostgreSQL が既定値になったのか #
ここ数年で「特別な理由がなければ PostgreSQL」が業界の基本感覚になりました。理由は積み重ねです。
- 標準準拠と厳格さ: SQL 標準を誠実に守り、データ整合性に厳しい設計です。不正な日付を黙って受け入れる代わりにエラーを返します。この厳しさは、サービスが大きくなるほど資産になります。
- データ型と機能の幅: JSONB、配列、範囲型、全文検索、ウィンドウ関数まで、「それは別システムが必要」と言われていたものがかなりの部分内蔵されています。
- 拡張(extension)エコシステム: ベクトル検索の pgvector、地理情報の PostGIS、時系列の TimescaleDB のように、コアを変えずに機能を差し込める構造が「まず PostgreSQL で始めればどこへでも行ける」という信頼を作りました。埋め込み検索で扱った pgvector が代表例です。
- ライセンスとガバナンス: 寛容なオープンソースライセンスで、特定企業の所有物ではないコミュニティプロジェクトです。商用 DB や、ライセンスが揺れた他のオープンソース DB と対照的な安定感があります。
バージョンは毎年秋にメジャーが 1 つ出ます。この講座は現行の安定版(PostgreSQL 18、非同期 I/O で読み取り性能が大きく上がったバージョン)を基準に書き、バージョンによって変わる内容はその都度明示します。なお NoSQL との選択基準は DynamoDB vs RDS で、運用を任せるマネージドサービスの話は RDS vs 自前運用で扱いました。学習の段階では、ローカルに自分で立てるのが一番学びが多いです。
インストール: Docker 1 行で足ります #
ローカルの学習環境としては Docker が一番きれいです。インストールの痕跡を残さず、消してまた作れます。
docker run --name pg-lab -e POSTGRES_PASSWORD=devpass -p 5432:5432 -d postgres:18この 1 行で PostgreSQL 18 サーバーが 5432 ポートに立ち上がります。クライアントは GUI ツールも多いですが、この講座では psql(公式 CLI)を基本にします。どのサーバーにもあり、どの GUI より速く、トラブルの現場で最後に残る道具だからです。
docker exec -it pg-lab psql -U postgrespsql の最初の一歩: メタコマンド 5 つ #
psql には SQL とは別に、バックスラッシュで始まるメタコマンドがあります。5 つあれば始められます。
| コマンド | すること |
|---|---|
\l | データベース一覧 |
\c mydb | データベース切り替え |
\dt | 現在の DB のテーブル一覧 |
\d users | テーブル構造(カラム・インデックス・制約)を見る |
\x | 縦表示の切り替え(横に長い結果を見るとき) |
特に \d はこの講座でずっと使います。テーブルにどんなインデックスと制約が付いているかが 1 画面に出る、一番基本的な観察ツールです。
最初のサイクル: 作って、入れて、読む #
CREATE DATABASE lab;
\c lab
CREATE TABLE users (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email text NOT NULL UNIQUE,
name text NOT NULL,
created_at timestamptz NOT NULL DEFAULT now()
);
INSERT INTO users (email, name) VALUES
('tanaka@example.com', '田中太郎'),
('sato@example.com', '佐藤花子');
SELECT id, email, name, created_at FROM users WHERE email = 'tanaka@example.com';短い例ですが、この講座の習慣が 3 つすでに入っています。主キーは bigint IDENTITY(なぜこれが既定値なのか、UUID はいつ使うのかは次回)、時刻は timestamptz(ただの timestamp ではありません。これも次回の主題です)、そして NOT NULL を基本にして例外的に外す方向です。アプリケーションからの利用は ORM を経ることが多いはずですが、その層は SQLAlchemy 講座のような資料に任せて、このシリーズはその下の DB 自体に集中します。
まとめ #
- PostgreSQL は標準準拠、型・機能の幅、拡張エコシステム、安定したガバナンスの積み重ねで新規プロジェクトの既定値になりました。
- 学習環境は Docker 1 行で十分です。クライアントは psql を基本として身につけておくのが一番長持ちします。
- メタコマンド 5 つ(
\l、\c、\dt、\d、\x)が観察の始まりです。特に\dは講座を通して使います。 - 最初のテーブルにすでに 3 つの習慣を植えました。bigint IDENTITY の PK、timestamptz、NOT NULL 基本。理由は次回掘り下げます。
- 次回はデータ型とテーブル設計、その中でも「何として保存するか」の判断基準を扱います。