データの挿入、取得 | SQLiteの基本操作 | Python本格超入門

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

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

SQLiteは、アプリ内部や軽量なシステムで広く利用されている、サーバーレスで動作する非常にシンプルなデータベースです。Pythonには標準で sqlite3 モジュールが組み込まれているため、特別な環境構築なしですぐにデータベース操作を始めることができます。

この記事では、データベースにデータを新しく追加する「挿入(INSERT)」と、保存されたデータを取り出す「取得(SELECT)」の基本手順について解説します。

データを挿入する手順

データをデータベースに安全に挿入するためには、以下の4つのステップを踏むのが基本の流れです。

  1. データベースファイルに接続する(コネクションの確立)
  2. 操作の窓口となる「カーソル」を作成し、データを挿入するSQL文を実行する
  3. commit() を呼び出して、変更をデータベースに確定・保存する
  4. 開いた接続を安全に閉じる(クローズ)

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に組み込む場合は、必ずこのプレースホルダーの仕組みを使用してください。

データを取得する手順

次に、データベースに保存されたデータを取り出してプログラム側で利用する手順です。

  1. データベースファイルに接続する
  2. データを検索・抽出するためのSQL文(SELECT)を実行する
  3. 実行結果を fetchall() などのメソッドでPythonのリストとして引き抜く(フェッチ)
  4. データベース接続を閉じる

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で扱う際にも共通する基本中の基本です。この確実な流れを体に染み込ませておきましょう。