
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文を使うと、接続のクローズを忘れる心配がなくて便利です!エラーハンドリングも自動でしてくれますよ。
みーちゃんのワンポイント
データベース操作で最も大切なことは、データの永続化とリソース管理です。INSERTやUPDATEなどの書き込み操作を行った後は、必ずconn.commit()を呼び出して変更をデータベースに保存してください。また、with文を使うと、接続を自動的に閉じたり、エラー発生時に変更を元に戻したり(ロールバック)してくれるので、安全でスマートなコードになりますよ!

