Python | DB・SQL:PostgreSQL

Python
スポンサーリンク

PostgreSQL ってそもそも何者?

PostgreSQL(ポストグレスキューエル)は、オープンソースのリレーショナルデータベース管理システム(RDBMS)です。
「無料で使えるのに、企業の本番システムでもガチで使われている、かなり本格派のデータベース」と思ってください。

Python からも非常に相性がよく、Django などの Web フレームワークでも標準的に採用されます。
ACID に準拠したトランザクション、強力な SQL 機能、拡張性の高さ(拡張モジュール・独自型・関数など)が特徴です。

ここでは、「PostgreSQL を初めて触る Python プログラマ」を想定して、
イメージ → 基本操作 → Python 連携、という流れでかみ砕いていきます。


PostgreSQL のイメージをつかむ

「Excel の超強化版」だと思ってみる

まずはざっくりしたイメージからいきます。
Excel にはシートがあって、その中に表(行と列)が並んでいますよね。
PostgreSQL では、データベースの中にテーブルがあり、その中に行と列が並んでいます。

Excel と違うのは、次のような点です。

同時にたくさんの人やアプリからアクセスできる。
データ量が何百万行、何千万行になっても耐えられるように設計されている。
SQL という言語で、検索・集計・更新を行う。

「Excel でやっていたことを、もっと大規模・高性能・安全にやるための仕組み」
それが PostgreSQL だとイメージすると、入りやすくなります。

RDBMS としての位置づけ

PostgreSQL は、MySQL / MariaDB、SQLite、Oracle Database などと同じ「RDBMS」の一種です。
その中でも PostgreSQL は、標準 SQL への準拠度が高く、機能が豊富で、拡張性が高いことで知られています。

Python で Web アプリや API を作るとき、
「本番でちゃんと動く RDB を使いたい」となったら、PostgreSQL を選ぶのはかなり良い選択です。


PostgreSQL の基本構造(データベース・スキーマ・テーブル)

データベースとスキーマとテーブル

PostgreSQL の中は、ざっくり次のような階層になっています。

サーバー(PostgreSQL 本体)
その中に複数の「データベース」
データベースの中に複数の「スキーマ」
スキーマの中に複数の「テーブル」

初心者のうちは、まず「データベース」と「テーブル」だけ意識できれば十分です。
スキーマは「データベース内のフォルダ分け」くらいのイメージで OK です。

例えば、アプリ用に myapp というデータベースを作り、その中に users テーブルや orders テーブルを作る、という感じです。

psql での基本操作イメージ

PostgreSQL には psql という対話型のコマンドラインツールがあります。

データベースに接続して、テーブルを作る流れのイメージはこんな感じです。

# データベースに接続
psql -U myuser -d mydb

接続したら、SQL をそのまま打てます。

-- テーブル作成
CREATE TABLE users (
    id   SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL
);

-- データ挿入
INSERT INTO users (name, email)
VALUES ('Taro', 'taro@example.com');

-- データ取得
SELECT * FROM users;
SQL

この「psql で SQL を打つ感覚」が一度つかめると、
Python からやることもイメージしやすくなります。


PostgreSQL ならではの特徴を初心者目線で押さえる

ACID 準拠のトランザクション

PostgreSQL は ACID に準拠したトランザクションをサポートしています。frkz.jp

Atomicity(全部やるか全部やらないか)
Consistency(ルールを壊さない)
Isolation(同時実行でも変にならない)
Durability(確定したら消えない)

これにより、「注文を登録して在庫を減らす」「送金する」といった、
途中で失敗したら困る処理を安全に扱えます。

SQL レベルでは、次のような形で使います。

BEGIN;

INSERT INTO orders (user_id, total_amount)
VALUES (1, 3000);

UPDATE products
SET stock = stock - 1
WHERE id = 10;

COMMIT;
SQL

途中でエラーが起きたら COMMIT の代わりに ROLLBACK され、
この一連の変更はなかったことになります。

拡張性の高さ(拡張モジュール・独自型・関数)

PostgreSQL の強みの一つが「拡張性」です。

拡張モジュール(extension)を追加して機能を増やせる
独自のデータ型(例:JSONB、配列、地理情報など)が豊富
ユーザー定義関数やストアドプロシージャも書ける

例えば、JSON をそのままカラムに保存して検索したい場合、
PostgreSQL の JSONB 型は非常に強力です。

CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    payload JSONB
);

INSERT INTO events (payload)
VALUES ('{"type": "signup", "user_id": 1}');

SELECT *
FROM events
WHERE payload->>'type' = 'signup';
SQL

「RDB なのに、NoSQL 的な柔軟さも持っている」のが PostgreSQL の面白いところです。


Python から PostgreSQL を触るイメージ

素の psycopg2 での接続イメージ

Python から PostgreSQL に接続する代表的なライブラリが psycopg2 です。

基本的な流れは次のようになります。

import psycopg2

conn = psycopg2.connect(
    dbname="mydb",
    user="myuser",
    password="secret",
    host="localhost",
    port=5432,
)

with conn:
    with conn.cursor() as cur:
        cur.execute(
            "INSERT INTO users (name, email) VALUES (%s, %s)",
            ("Taro", "taro@example.com"),
        )

with conn:
    with conn.cursor() as cur:
        cur.execute("SELECT id, name, email FROM users")
        rows = cur.fetchall()
        for row in rows:
            print(row)
Python

with conn: のブロックは、トランザクションの単位だと思ってください。
ブロック内で例外が起きなければ COMMIT、起きれば ROLLBACK される実装が多いです。

Django と PostgreSQL の組み合わせ

Django では、設定ファイル settings.py で DATABASES を PostgreSQL にすると、
ORM を通じて自然に PostgreSQL を使えます。

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "mydb",
        "USER": "myuser",
        "PASSWORD": "secret",
        "HOST": "localhost",
        "PORT": "5432",
    }
}
Python

あとは、Django のモデルを定義して migrate すれば、
裏側で PostgreSQL にテーブルが作られます。

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
Python

このモデルに対して、

User.objects.create(name="Taro", email="taro@example.com")
User.objects.filter(email="taro@example.com")
Python

のように書くと、Django が PostgreSQL 向けの SQL を自動生成してくれます。
「PostgreSQL の強さを、Python からほぼ意識せずに使える」わけです。


PostgreSQL を学ぶときの“攻め方”

まずは「SQL の基本」+「PostgreSQL で実行」のセットで覚える

PostgreSQL は高機能ですが、最初から全部を覚える必要はありません。
最初のステップとしては、次の流れが一番効率的です。

テーブルを作る(CREATE TABLE)
データを入れる(INSERT)
データを取る(SELECT、WHERE、JOIN、GROUP BY)
データを更新・削除する(UPDATE、DELETE)

これらの「SQL の基本」を、PostgreSQL 上で実行してみることが大事です。

その上で、

トランザクション(BEGIN / COMMIT / ROLLBACK)
インデックス(CREATE INDEX)
JSONB などの PostgreSQL らしい型

といった「PostgreSQL ならではの強み」を少しずつ足していくと、
無理なくレベルアップできます。

「PostgreSQL を意識するタイミング」はここ

Python から見ると、RDB はどれも似ていますが、
次のような場面では「PostgreSQL らしさ」を意識すると得をします。

JSON を扱いたい(JSONB)
全文検索やランキングをやりたい(拡張やインデックス)
大きなテーブルでパフォーマンスを出したい(インデックス・実行計画)
複雑な集計やウィンドウ関数を使いたい

こういうときに、「PostgreSQL ってこういうこと得意なんだよな」という感覚があると、
設計の選択肢が一気に広がります。


まとめ(PostgreSQL は「本番で戦える、Python と相性のいい RDB の本命」)

PostgreSQL を初心者目線でまとめると、こうなります。

オープンソースで無料なのに、企業の本番でもガチで使われる、信頼性と機能が高い RDBMS。
SQL の基本(SELECT / INSERT / UPDATE / DELETE)を押さえれば、psql でも Python からでも同じ感覚で扱える。
ACID 準拠のトランザクションや豊富なデータ型、拡張性の高さが強みで、Web アプリ・API・業務システムなど幅広く使える。
Django などのフレームワークと組み合わせると、「PostgreSQL の強さを裏で使いながら、Python コードはシンプルに書ける」。

タイトルとURLをコピーしました