手軽にデータベースを使いたい!Python標準ライブラリ「sqlite3」で始めるDB操作

投稿者: | 2026-02-27

Pythonでちょっとしたデータを保存したり、管理したりしたいけれど、本格的なデータベースサーバーを立てるのは少しハードルが高いと感じることはありませんか?そんなときに大活躍するのが、Pythonに標準で搭載されている軽量データベースSQLiteを操作するためのライブラリ『sqlite3』です。追加のインストールは一切不要で、すぐに使い始められるのが魅力なんですよ。

Pythonの標準ライブラリなので、気軽に試せるのが嬉しいですよね!

概要

sqlite3ライブラリは、サーバーを必要としないファイルベースのデータベースシステム『SQLite』をPythonから利用するためのモジュールです。SQLiteは、データベース全体がたった一つのファイルとして保存されるため、アプリケーションへの組み込みや、データの持ち運びが非常に簡単です。RDBMS(リレーショナルデータベース管理システム)の一種なので、SQLを使ってデータの操作を行います。Pythonのsqlite3を使えば、SQL文を直接実行したり、Pythonのデータとデータベースのデータを連携させたりと、柔軟なデータ管理が可能になります。

メリット

sqlite3をPythonプロジェクトで使うことには、たくさんのメリットがあります。

  • 手軽さ: Pythonに標準で組み込まれているため、pip installなどの追加インストールが不要です。すぐにコードを書き始めることができます。
  • 軽量・高機能: SQLite自体が非常に軽量でありながら、複雑なクエリやトランザクション処理など、RDBMSとして必要な基本的な機能はしっかり備わっています。
  • ポータビリティ: データベースが単一のファイルとして存在するため、アプリケーションと一緒に簡単に持ち運びできます。USBメモリに入れて持ち運んだり、メールで送ったりするのも簡単です。
  • 学習コストの低さ: SQLの基本的な知識があれば、すぐにデータベース操作を始められます。Webアプリケーションのバックエンドや、デスクトップアプリケーションのデータ保存など、幅広い用途で活用できます。

サンプルコード

それでは、実際にsqlite3を使ってデータベースを作成し、データを操作する基本的な流れを見ていきましょう。

import sqlite3

# 1. データベースに接続(ファイルがなければ新規作成)
# ':memory:' を指定するとメモリ上に一時的なデータベースを作成します
conn = sqlite3.connect('my_database.db')
print("データベースに接続しました。")

# 2. カーソルオブジェクトの作成
# カーソルを使ってSQLコマンドを実行します
cursor = conn.cursor()

# 3. テーブルの作成
# 存在しない場合のみテーブルを作成します
try:
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            age INTEGER
        )
    ''')
    print("テーブル 'users' を作成しました(または既に存在します)。")
except sqlite3.Error as e:
    print(f"テーブル作成中にエラーが発生しました: {e}")

# 4. データの挿入
# プレースホルダ (?) を使うことでSQLインジェクションを防ぎ、安全にデータを挿入できます
user_data = [
    ('Alice', 25),
    ('Bob', 30),
    ('Charlie', 22)
]
cursor.executemany("INSERT INTO users (name, age) VALUES (?, ?)", user_data)
print("データを挿入しました。")

# 5. 変更をコミット(データベースに保存)
# INSERT, UPDATE, DELETEなどの変更はcommit()するまで永続化されません
conn.commit()
print("変更をコミットしました。")

# 6. データの取得
print("\n--- 全ユーザーの取得 ---")
cursor.execute("SELECT id, name, age FROM users")
all_users = cursor.fetchall() # 全ての行を取得
for user in all_users:
    print(f"ID: {user[0]}, 名前: {user[1]}, 年齢: {user[2]}")

print("\n--- 特定の条件でユーザーを取得 ---")
target_age = 25
cursor.execute("SELECT name, age FROM users WHERE age > ?", (target_age,))
older_users = cursor.fetchall()
for user in older_users:
    print(f"名前: {user[0]}, 年齢: {user[1]}")

# 7. データの更新
cursor.execute("UPDATE users SET age = ? WHERE name = ?", (26, 'Alice'))
conn.commit()
print("\nAliceの年齢を更新しました。")

# 8. 更新後のデータを確認
print("\n--- 更新後のAliceの情報 ---")
cursor.execute("SELECT name, age FROM users WHERE name = 'Alice'")
alice_info = cursor.fetchone() # 1行だけ取得
if alice_info:
    print(f"名前: {alice_info[0]}, 年齢: {alice_info[1]}")

# 9. データの削除
cursor.execute("DELETE FROM users WHERE name = 'Charlie'")
conn.commit()
print("\nCharlieのデータを削除しました。")

# 10. 全ての操作が完了したらデータベース接続をクローズ
conn.close()
print("データベース接続をクローズしました。")

# with文を使ったより安全な接続例
print("\n--- with文を使った安全な接続例 ---")
try:
    with sqlite3.connect('my_database_with_with.db') as conn_with:
        cursor_with = conn_with.cursor()
        cursor_with.execute('''
            CREATE TABLE IF NOT EXISTS products (
                id INTEGER PRIMARY KEY,
                name TEXT NOT NULL,
                price REAL
            )
        ''')
        cursor_with.execute("INSERT INTO products (name, price) VALUES (?, ?)", ('Apple', 1.0))
        cursor_with.execute("INSERT INTO products (name, price) VALUES (?, ?)", ('Banana', 0.5))
        # with文を使うと、明示的にconn_with.commit()を呼ばなくても、
        # ブロックの終了時に自動的にコミットされます(エラーがなければ)。
        # エラーが発生した場合はロールバックされます。

        print("productsテーブルにデータを挿入しました。")
        cursor_with.execute("SELECT * FROM products")
        for row in cursor_with.fetchall():
            print(row)
    print("with文によるデータベース操作が完了しました。")
except sqlite3.Error as e:
    print(f"with文での操作中にエラーが発生しました: {e}")

with文を使うと、接続のクローズを忘れる心配がなくて便利です!エラーハンドリングも自動でしてくれますよ。

みーちゃんのワンポイント

データベース操作で最も大切なことは、データの永続化とリソース管理です。INSERTUPDATEなどの書き込み操作を行った後は、必ずconn.commit()を呼び出して変更をデータベースに保存してください。また、with文を使うと、接続を自動的に閉じたり、エラー発生時に変更を元に戻したり(ロールバック)してくれるので、安全でスマートなコードになりますよ!