sqlite3 モジュールを使用し、データベースへの「テーブル作成(CREATE)」と「データ登録(INSERT)」を行う実装です。 ここでは、Webサービスの会員情報を管理するデータベースを想定し、セキュリティを考慮したプレースホルダを使用した実装を行います。
ソースコード
import sqlite3
# データベースファイル名
db_file = "service_members.db"
# 1. データベース接続
# with文を使用することで、処理後のclose漏れを防ぎます
with sqlite3.connect(db_file) as conn:
cur = conn.cursor()
# --- 1. テーブルの作成 (CREATE) ---
# 会員ID(整数), 名前(文字列), メール(文字列), ランク(文字列)
create_sql = """
CREATE TABLE IF NOT EXISTS members (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE,
rank TEXT
)
"""
cur.execute(create_sql)
# --- 2. データの挿入 (INSERT) ---
# 登録する会員データ(リスト形式)
new_members = [
(1001, "山田太郎", "yamada@example.com", "Gold"),
(1002, "佐藤花子", "sato@test.co.jp", "Silver"),
(1003, "高橋健一", "takahashi@web.net", "Bronze")
]
# プレースホルダ (?) を使用したSQL文
# 安全に値を埋め込むために、文字列結合ではなく必ずこれを使います
insert_sql = "INSERT INTO members (id, name, email, rank) VALUES (?, ?, ?, ?)"
# executemany でリスト内のデータを一括登録
try:
cur.executemany(insert_sql, new_members)
# --- 3. 変更の確定 (COMMIT) ---
# データを変更した場合は必ずコミットが必要です
conn.commit()
print(f"データ登録完了: {len(new_members)}件の会員を追加しました。")
except sqlite3.IntegrityError as e:
# IDやメールアドレスの重複などでエラーになった場合
print(f"データ登録エラー: {e}")
# 実行後、カレントディレクトリに 'service_members.db' が生成されます
実行結果
データ登録完了: 3件の会員を追加しました。
目次
解説
1. CREATE TABLE IF NOT EXISTS
「もしテーブルが存在しなければ作成する」という命令です。プログラムを何度実行しても、テーブルが既にある場合はエラーにならずに無視されるため、安全に再実行できます。
2. executemany(sql, data_list)
複数のデータをループで回して execute するよりも高速に処理できます。リストやタプルでまとめたデータを一気にデータベースへ流し込む際に使用します。
3. トランザクションとコミット
conn.commit() を実行した時点で初めてファイルにデータが書き込まれます。もし executemany の途中でエラーが発生した場合、コミット前であればデータは1件も保存されないため、データの整合性が保たれます(ロールバック的な挙動)。
