PythonとSQLite入門:はじめてのデータベース操作ガイド

本記事では、Python初心者を対象に、組み込み型データベース「SQLite」を使ったデータ操作の基本を解説します。

SQLiteはサーバー不要で手軽に使えるため、ちょっとしたデータの保存や試作プロジェクトにも最適です。

この記事を読むことで、PythonでのSQLiteの導入から基本的なCRUD操作(データの作成・読み取り・更新・削除)、そして簡単な演習問題を通じた理解まで、一連の流れを身につけることができます。


SQLiteとは?

組み込み型のデータベース

SQLiteはファイル単体で動作する軽量なデータベースです。サーバーを立てる必要がなく、アプリケーションと同じディレクトリにDBファイルを置くだけで利用可能です。

特徴
  • サーバーレス(ネットワーク接続不要)
  • 設定不要(インストール後すぐ使える)
  • ACID準拠で信頼性が高い
  • SQL99相当の機能を実装

PythonからSQLiteを使う準備

Pythonには標準ライブラリとして sqlite3 モジュールが用意されています。追加インストールは不要です。

import sqlite3

# データベースに接続(ファイルがなければ新規作成)
conn = sqlite3.connect('sample.db')

# SQLite操作用のカーソルを取得
cur = conn.cursor()

connect(‘ファイル名’) でDBファイルに接続でき、メモリ上だけで済ませたい場合は ‘:memory:’ を指定します。

cursor() でクエリ実行用のオブジェクトを取得します。


テーブルの作成

まずはテーブルを作ります。ここでは「ユーザー情報」を格納する users テーブルを例にします。

# テーブル作成用SQL(なければ作成)
create_table_sql = """
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER,
    email TEXT UNIQUE
);
"""
cur.execute(create_table_sql)
conn.commit()
  • IF NOT EXISTS:既に存在する場合はスキップ
  • PRIMARY KEY AUTOINCREMENT で自動採番
  • TEXT, INTEGER といった型を利用

データの追加・取得・更新・削除(CRUD)

データの追加(CREATE)

# データ挿入用SQL
insert_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?);"
users = [
    ('Alice', 30, 'alice@example.com'),
    ('Bob', 25, 'bob@example.com'),
    ('Charlie', 22, 'charlie@example.com'),
]

# 複数行を一度に挿入
cur.executemany(insert_sql, users)
conn.commit()

? プレースホルダを使うことで、SQLインジェクション対策になります。

データの取得(READ)

# 全件取得
cur.execute("SELECT * FROM users;")
rows = cur.fetchall()
for row in rows:
    print(row)  # (id, name, age, email)
  • fetchall():すべての結果をリストで取得
  • fetchone():1行ずつ取得も可能

データの更新(UPDATE)

# Bobの年齢を26に更新
cur.execute("UPDATE users SET age = ? WHERE name = ?;", (26, 'Bob'))
conn.commit()

データの削除(DELETE)

# ageが25未満のユーザーを削除
cur.execute("DELETE FROM users WHERE age < ?;", (25,))
conn.commit()

応用クエリとトランザクション制御

条件付き取得

# ageが25以上のユーザーのみ取得
cur.execute("SELECT name, email FROM users WHERE age >= ?;", (25,))
for name, email in cur.fetchall():
    print(f"{name}:{email}")

並び替え・件数制限

# 年齢の降順で3件だけ取得
cur.execute("SELECT * FROM users ORDER BY age DESC LIMIT 3;")
for row in cur.fetchall():
    print(row)

トランザクション

SQLiteはデフォルトでオートコミットですが、複数操作をまとめてロールバック可能にしたい場合は以下のように制御します。

try:
    conn.execute('BEGIN;')
    # 複数の更新・削除など
    cur.execute("UPDATE users SET age = age + 1;")
    cur.execute("DELETE FROM users WHERE age > ?;", (100,))
    conn.commit()
except Exception as e:
    conn.rollback()
    print("エラー発生。ロールバックしました。", e)

接続の終了と注意点

接続の終了
cur.close()
conn.close()
注意点
  • 文字コードはUTF‑8が基本
  • 大量データを扱う際は一度にコミットせずバルク操作を検討
  • 同時アクセスを行う場合は排他制御に注意

演習問題

以下の問題を解いて、理解を深めましょう。

問題1:テーブル設計&作成

「products」というテーブルを作成してください。

カラム
  • product_id(主キー、整数、自動採番)
  • name(テキスト、NOT NULL)
  • price(実数、NOT NULL)
  • stock(整数、デフォルト0)

問題2:データ挿入&取得

  1. products テーブルに以下のデータを挿入してください。
    • (name=’Notebook’, price=1200.5, stock=10)
    • (name=’Pen’, price=100.0, stock=50)
  2. 価格が500以上の商品を取得し、nameとpriceのみ表示してください。

問題3:データ更新&削除

  1. ‘Pen’の在庫を30に更新してください。
  2. 価格が1000以上の商品を削除してください。

解答例

解答1:テーブル作成

import sqlite3
conn = sqlite3.connect('sample.db')
cur = conn.cursor()

create_products_sql = """
CREATE TABLE IF NOT EXISTS products (
    product_id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    price REAL NOT NULL,
    stock INTEGER DEFAULT 0
);
"""
cur.execute(create_products_sql)
conn.commit()
cur.close()
conn.close()

解答2:データ挿入&取得

# データ挿入
conn = sqlite3.connect('sample.db')
cur = conn.cursor()
insert_prod_sql = "INSERT INTO products (name, price, stock) VALUES (?, ?, ?);"
products = [
    ('Notebook', 1200.5, 10),
    ('Pen', 100.0, 50)
]
cur.executemany(insert_prod_sql, products)
conn.commit()

# 取得
cur.execute("SELECT name, price FROM products WHERE price >= ?;", (500,))
for name, price in cur.fetchall():
    print(f"{name}:{price}円")

cur.close()
conn.close()

解答3:更新&削除

conn = sqlite3.connect('sample.db')
cur = conn.cursor()

# 在庫更新
cur.execute("UPDATE products SET stock = ? WHERE name = ?;", (30, 'Pen'))

# 商品削除
cur.execute("DELETE FROM products WHERE price >= ?;", (1000,))

conn.commit()
cur.close()
conn.close()

以上で、PythonからSQLiteを使った基本操作の解説と練習問題・解答例の紹介は完了です。ぜひ手を動かしながら試してみてください!