本記事では、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:データ挿入&取得
- products テーブルに以下のデータを挿入してください。
- (name=’Notebook’, price=1200.5, stock=10)
- (name=’Pen’, price=100.0, stock=50)
- 価格が500以上の商品を取得し、nameとpriceのみ表示してください。
問題3:データ更新&削除
- ‘Pen’の在庫を30に更新してください。
- 価格が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を使った基本操作の解説と練習問題・解答例の紹介は完了です。ぜひ手を動かしながら試してみてください!