SQLiteでデータの挿入と取得を行う方法

SQLiteは、アプリ内部や軽量なシステムで広く利用されている、サーバーレスで動作する非常にシンプルなデータベースです。Pythonには標準で sqlite3 モジュールが組み込まれているため、特別な環境構築なしですぐにデータベース操作を始めることができます。
この記事では、データベースにデータを新しく追加する「挿入(INSERT)」と、保存されたデータを取り出す「取得(SELECT)」の基本手順について解説します。
データを挿入する手順
データをデータベースに安全に挿入するためには、以下の4つのステップを踏むのが基本の流れです。
- データベースファイルに接続する(コネクションの確立)
- 操作の窓口となる「カーソル」を作成し、データを挿入するSQL文を実行する
commit()を呼び出して、変更をデータベースに確定・保存する- 開いた接続を安全に閉じる(クローズ)
Pythonによるデータ挿入のコード例
以下は、users テーブルに対して新しいユーザーのデータを1件登録する具体的なプログラムです。
import sqlite3
# データベースに接続(ファイルが存在しない場合は新規に自動作成されます)
conn = sqlite3.connect('example.db')
# SQLを実行するためのカーソルオブジェクトを作成
cursor = conn.cursor()
# データを挿入するSQL文(安全性のためにプレースホルダーを使用)
sql = "INSERT INTO users (name, age) VALUES (?, ?)"
data = ('John Doe', 30)
# SQLにデータを安全に流し込んで実行
cursor.execute(sql, data)
# 【重要】コミットして変更を物理ファイルに書き込む
conn.commit()
# データベース接続を閉じる
conn.close()
実務視点による解説:プレースホルダーの重要性
上記のコードで最も重要な部分は、SQL文の中に直接 'John Doe' などの文字列を書き込まず、?(プレースホルダー) を配置している点です。
cursor.execute(sql, data) のように、SQLの骨組みと実際のデータを完全に分けてPythonに渡すことで、データベースを不正に操作しようとするサイバー攻撃(SQLインジェクション)を完全に防ぐことができます。ユーザーがフォームに入力した値などをSQLに組み込む場合は、必ずこのプレースホルダーの仕組みを使用してください。
データを取得する手順
次に、データベースに保存されたデータを取り出してプログラム側で利用する手順です。
- データベースファイルに接続する
- データを検索・抽出するためのSQL文(SELECT)を実行する
- 実行結果を
fetchall()などのメソッドでPythonのリストとして引き抜く(フェッチ) - データベース接続を閉じる
Pythonによるデータ取得のコード例
先ほど挿入したデータを含め、users テーブルに眠っているレコードをすべて画面に出力するプログラムです。
import sqlite3
# データベースに接続
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
# データを取得するSQL文を実行
cursor.execute('SELECT id, name, age FROM users')
# 検索にヒットしたすべての行を一括で引き抜く
rows = cursor.fetchall()
# 取得したデータ(タプルのリスト)をループ処理で1行ずつ表示
for row in rows:
print(f"ID: {row[0]}, 名前: {row[1]}, 年齢: {row[2]}")
# データベース接続を閉じる
conn.close()
実務視点による解説:データの取り出し方(フェッチ)
cursor.fetchall() を実行すると、データベースから取得したデータが「タプルを内包したリスト」(例:[(1, 'John Doe', 30), (2, 'Alice', 25)])の形式で返ってきます。
今回は SELECT * ではなく、SELECT id, name, age と取得したいカラム(列)の名前を明示しました。こうすることで、row[0] が id、row[1] が name と順番が固定されるため、コードの可読性が上がり、バグの発生を抑えることができます。
まとめ
SQLiteを使ってデータの挿入と取得を行う際の重要ポイントは以下の通りです。
- 挿入(INSERT)の後は必ず
conn.commit()を呼ぶ:これを行わないと、プログラムが正常に終わってもデータは一切保存されず消滅してしまいます。 - セキュリティ対策に
?を使う:SQLインジェクションの脆弱性を排除するため、変数をSQLに埋め込む際は直接文字列結合(+や f-strings)をせず、必ずプレースホルダーを使用します。 - 取得データはタプル形式:
fetchall()で回収した結果はタプルのリストであるため、for文やインデックス(row[0])を使って要素にアクセスします。
これらの「接続 → カーソル作成 → SQL実行 → コミット/フェッチ → クローズ」という一連のライフサイクルは、SQLiteだけでなく、MySQLやPostgreSQLといった本格的なリレーショナルデータベース(RDB)をPythonで扱う際にも共通する基本中の基本です。この確実な流れを体に染み込ませておきましょう。