Python | DB・SQL:CRUD

Python
スポンサーリンク

CRUD って何?まずは全体像から

CRUD(クラッド)は、データベース操作の基本 4 セットの頭文字です。
Create(作る)、Read(読む)、Update(更新する)、Delete(削除する)。

アプリがデータベースに対してやっていることは、ほぼ全部この 4 つの組み合わせです。
ユーザー登録も、タスク一覧表示も、プロフィール編集も、アカウント削除も、全部 CRUD のどれか(または複数)です。

ここでは、SQLite と Python(素の sqlite3 と、最後に ORM のイメージ)を使って、
CRUD を一つずつ、初心者向けにかみ砕いていきます。


事前準備:users テーブルを 1 個だけ用意する

テーブル定義と初期セットアップ

まずは、例として使う users テーブルを 1 個作ります。
SQLite と Python 標準の sqlite3 を使います。

import sqlite3

conn = sqlite3.connect("app.db")
cur = conn.cursor()

cur.execute(
    """
    CREATE TABLE IF NOT EXISTS users (
        id     INTEGER PRIMARY KEY AUTOINCREMENT,
        name   TEXT NOT NULL,
        email  TEXT UNIQUE NOT NULL
    )
    """
)

conn.commit()
conn.close()
Python

これで、app.db というファイルの中に users テーブルができました。
ここから、このテーブルに対して CRUD を順番にやっていきます。


C:Create(作る)= 新しい行を追加する

SQL としての INSERT のイメージ

Create は「新しいデータを作る」、つまりテーブルに行を追加する操作です。
SQL では INSERT 文を使います。

INSERT INTO users (name, email)
VALUES ('Taro', 'taro@example.com');
SQL

この 1 行で、「Taro さん」というユーザーが 1 行追加されます。
id は AUTOINCREMENT なので、勝手に 1, 2, 3…と振られます。

Python からの INSERT(Create)

同じことを Python からやると、こうなります。

import sqlite3

conn = sqlite3.connect("app.db")
cur = conn.cursor()

cur.execute(
    "INSERT INTO users (name, email) VALUES (?, ?)",
    ("Taro", "taro@example.com"),
)

conn.commit()
conn.close()
Python

ここで重要なのは、VALUES (?, ?)? と、後ろのタプルです。
文字列を直接埋め込まず、プレースホルダを使うのが安全な書き方です。

Create のポイントは、「1 行分のデータを渡して、テーブルに新しい行を増やす」ということです。
アプリでいうと、「ユーザー登録」「新規タスク作成」「新しい記事投稿」などが全部 Create です。


R:Read(読む)= 行を取り出してくる

SQL としての SELECT のイメージ

Read は「データを読む」、つまりテーブルから行を取り出す操作です。
SQL では SELECT 文を使います。

全部のユーザーを取りたいときは、こうです。

SELECT id, name, email
FROM users;
SQL

特定のユーザーだけを取りたいときは、WHERE で絞ります。

SELECT id, name, email
FROM users
WHERE email = 'taro@example.com';
SQL

Python からの SELECT(Read)

Python で全部のユーザーを読む例です。

import sqlite3

conn = sqlite3.connect("app.db")
cur = conn.cursor()

cur.execute("SELECT id, name, email FROM users")
rows = cur.fetchall()

for row in rows:
    print(row)

conn.close()
Python

fetchall() は「結果を全部リストで取る」メソッドです。
1 行だけ欲しいときは fetchone() を使います。

conn = sqlite3.connect("app.db")
cur = conn.cursor()

cur.execute(
    "SELECT id, name, email FROM users WHERE email = ?",
    ("taro@example.com",),
)
row = cur.fetchone()
print(row)

conn.close()
Python

Read のポイントは、「テーブルの中身を“見る”だけで、まだ何も変えていない」ということです。
アプリでいうと、「一覧表示」「詳細画面」「検索結果表示」などが Read です。


U:Update(更新)= 既存の行の値を変える

SQL としての UPDATE のイメージ

Update は「既にあるデータを更新する」操作です。
SQL では UPDATE 文を使います。

例えば、「Taro さんの名前を Taro Yamada に変えたい」とします。

UPDATE users
SET name = 'Taro Yamada'
WHERE email = 'taro@example.com';
SQL

ここで WHERE がとても重要です。
WHERE を書かないと、全行の name が同じ値に変わってしまいます。

Python からの UPDATE(Update)

Python で同じことをやると、こうなります。

import sqlite3

conn = sqlite3.connect("app.db")
cur = conn.cursor()

cur.execute(
    "UPDATE users SET name = ? WHERE email = ?",
    ("Taro Yamada", "taro@example.com"),
)

conn.commit()
conn.close()
Python

ここでも、commit() を忘れると変更が保存されません。
Update は、「どの行を」「どのカラムを」「どんな値に変えるか」を明確に指定するのが大事です。

アプリでいうと、「プロフィール編集」「タスクのタイトル変更」「ステータス更新」などが Update です。


D:Delete(削除)= 行を消す

SQL としての DELETE のイメージ

Delete は「データを削除する」操作です。
SQL では DELETE 文を使います。

例えば、「Taro さんを削除したい」とします。

DELETE FROM users
WHERE email = 'taro@example.com';
SQL

これも WHERE が超重要です。
WHERE を書かないと、テーブルの全行が消えます。

Python からの DELETE(Delete)

Python で同じことをやると、こうなります。

import sqlite3

conn = sqlite3.connect("app.db")
cur = conn.cursor()

cur.execute(
    "DELETE FROM users WHERE email = ?",
    ("taro@example.com",),
)

conn.commit()
conn.close()
Python

Delete のポイントは、「本当に消していいのか」「論理削除にするか(フラグだけ立てるか)」など、設計上の判断が絡みやすいところです。
アプリでいうと、「アカウント削除」「タスク削除」「投稿削除」などが Delete です。


CRUD を一連の流れとしてイメージする

1 人のユーザーを CRUD で一周させてみる

ここまでの内容を、1 人のユーザーで一周させてみます。

Create:ユーザーを登録する
Read:登録されたユーザーを一覧表示する
Update:ユーザーの名前を変更する
Delete:ユーザーを削除する

コードをまとめると、こんな感じになります。

import sqlite3

conn = sqlite3.connect("app.db")
cur = conn.cursor()

cur.execute(
    """
    CREATE TABLE IF NOT EXISTS users (
        id     INTEGER PRIMARY KEY AUTOINCREMENT,
        name   TEXT NOT NULL,
        email  TEXT UNIQUE NOT NULL
    )
    """
)

conn.commit()

cur.execute(
    "INSERT INTO users (name, email) VALUES (?, ?)",
    ("Taro", "taro@example.com"),
)
conn.commit()

cur.execute("SELECT id, name, email FROM users")
print("READ:", cur.fetchall())

cur.execute(
    "UPDATE users SET name = ? WHERE email = ?",
    ("Taro Yamada", "taro@example.com"),
)
conn.commit()

cur.execute("SELECT id, name, email FROM users")
print("AFTER UPDATE:", cur.fetchall())

cur.execute(
    "DELETE FROM users WHERE email = ?",
    ("taro@example.com",),
)
conn.commit()

cur.execute("SELECT id, name, email FROM users")
print("AFTER DELETE:", cur.fetchall())

conn.close()
Python

このスクリプトを実行すると、
Create → Read → Update → Read → Delete → Read
という CRUD の一連の流れが、コンソール出力で確認できます。


ORM(SQLAlchemy)での CRUD のイメージも少しだけ

ORM だと CRUD が「オブジェクト操作」になる

同じ users テーブルを、SQLAlchemy の ORM モデルで扱うと、CRUD はこうなります。

まずモデル定義です。

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.orm import declarative_base, sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String, nullable=False)
    email = Column(String, unique=True, nullable=False)

engine = create_engine("sqlite:///example.db", echo=True)
Base.metadata.create_all(engine)
SessionLocal = sessionmaker(bind=engine)
Python

Create:

session = SessionLocal()
user = User(name="Taro", email="taro@example.com")
session.add(user)
session.commit()
session.close()
Python

Read:

session = SessionLocal()
user = session.query(User).filter_by(email="taro@example.com").first()
print(user.id, user.name, user.email)
session.close()
Python

Update:

session = SessionLocal()
user = session.query(User).filter_by(email="taro@example.com").first()
user.name = "Taro Yamada"
session.commit()
session.close()
Python

Delete:

session = SessionLocal()
user = session.query(User).filter_by(email="taro@example.com").first()
session.delete(user)
session.commit()
session.close()
Python

SQL を直接書く代わりに、
「オブジェクトを作る・検索する・書き換える・削除する」という形で CRUD を表現できるのが、ORM の気持ちよさです。


まとめ(CRUD は「全部の DB 操作の土台」)

CRUD を初心者目線で整理すると、こうなります。

Create は「新しい行を追加する」(INSERT)。
Read は「行を読む」(SELECT)。
Update は「既存の行の値を変える」(UPDATE)。
Delete は「行を削除する」(DELETE)。

アプリで起きている DB 操作は、ほぼ全部この 4 つの組み合わせです。
だからこそ、CRUD をコードで一周書けるようになると、
「DB を使うアプリの骨格」が一気に見えてきます。

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