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';
SQLPython からの 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()
Pythonfetchall() は「結果を全部リストで取る」メソッドです。
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()
PythonRead のポイントは、「テーブルの中身を“見る”だけで、まだ何も変えていない」ということです。
アプリでいうと、「一覧表示」「詳細画面」「検索結果表示」などが 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()
PythonDelete のポイントは、「本当に消していいのか」「論理削除にするか(フラグだけ立てるか)」など、設計上の判断が絡みやすいところです。
アプリでいうと、「アカウント削除」「タスク削除」「投稿削除」などが 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)
PythonCreate:
session = SessionLocal()
user = User(name="Taro", email="taro@example.com")
session.add(user)
session.commit()
session.close()
PythonRead:
session = SessionLocal()
user = session.query(User).filter_by(email="taro@example.com").first()
print(user.id, user.name, user.email)
session.close()
PythonUpdate:
session = SessionLocal()
user = session.query(User).filter_by(email="taro@example.com").first()
user.name = "Taro Yamada"
session.commit()
session.close()
PythonDelete:
session = SessionLocal()
user = session.query(User).filter_by(email="taro@example.com").first()
session.delete(user)
session.commit()
session.close()
PythonSQL を直接書く代わりに、
「オブジェクトを作る・検索する・書き換える・削除する」という形で CRUD を表現できるのが、ORM の気持ちよさです。
まとめ(CRUD は「全部の DB 操作の土台」)
CRUD を初心者目線で整理すると、こうなります。
Create は「新しい行を追加する」(INSERT)。
Read は「行を読む」(SELECT)。
Update は「既存の行の値を変える」(UPDATE)。
Delete は「行を削除する」(DELETE)。
アプリで起きている DB 操作は、ほぼ全部この 4 つの組み合わせです。
だからこそ、CRUD をコードで一周書けるようになると、
「DB を使うアプリの骨格」が一気に見えてきます。
