プログラミングを始めたばかりの方は、こんなことを思ったことがありませんか?
- 「アプリでデータを保存したいけど、どうすればいいの?」
- 「データベースって難しそう…」
- 「MySQLとかPostgreSQLは設定が大変そう」
- 「もっと簡単にデータを管理する方法はないの?」
そんな悩みを解決してくれるのがSQLite(エスキューライト)です。
SQLiteは、まるで「データ専用のファイル」のように手軽に使えるデータベースで、スマホアプリやWebアプリ、個人プロジェクトなど、いろんな場面で活躍しています。
この記事では、「データベース?聞いたことはあるけど…」という方でも、SQLiteの基本から実際の使い方まで、ステップバイステップで学べるように丁寧に説明します。
SQLiteって何?なぜ人気なの?

SQLiteをわかりやすく説明すると
SQLiteは、データを整理して保存するための「とても軽くて使いやすいデータベース」です。
身近な例で考えてみましょう:
- 住所録アプリ→ 友達の連絡先を保存
- 家計簿アプリ→ 収入や支出の記録を保存
- ゲームアプリ→ スコアやプレイヤーの進行状況を保存
- 写真アプリ→ 写真の情報や分類を保存
これらすべてに、SQLiteが使われていることがとても多いのです。
他のデータベースとの違い
従来のデータベース(MySQL、PostgreSQLなど):
- サーバーという専用のコンピューターが必要
- 複雑な設定とインストールが必要
- 管理者が必要
- 複数の人が同時に使えるが、設定が大変
SQLite:
- 1つのファイルにすべてのデータが入る
- インストールほぼ不要(ファイルをコピーするだけ)
- 設定がとても簡単
- 一人で使うのに最適
SQLiteの魅力的な特徴
- 1. 超軽量 SQLite全体のサイズは約600KB程度。USBメモリにも簡単に入ります。
- 2. ファイルベース データベース全体が1つのファイルに保存されるので、バックアップやコピーが簡単です。
- 3. サーバー不要 専用のサーバーを用意する必要がありません。普通のファイルのように扱えます。
- 4. 高速 軽量なので、データの読み書きがとても速いです。
- 5. 信頼性 小さいながらも、データの整合性をしっかり保ってくれます。
実際にどこで使われているの?
スマートフォンアプリ:
- iPhone、Androidアプリの多くがSQLiteを使用
- 連絡先、カレンダー、メモアプリなど
Webブラウザ:
- Chrome、Firefox、Safariがブックマークや履歴の保存に使用
デスクトップアプリ:
- 音楽プレイヤー、写真管理ソフト、メールソフトなど
組み込みシステム:
- 車のナビゲーションシステム
- 家電製品の設定保存
SQLiteは「軽くて強力」なデータベースです。
SQLiteを使い始めてみよう

環境の準備(とても簡単!)
SQLiteの良いところは、ほとんど準備が要らないことです。
Windowsの場合:
- SQLite公式サイトにアクセス
- 「Precompiled Binaries for Windows」から「sqlite-tools-win32-x86」をダウンロード
- ダウンロードしたZIPファイルを解凍
sqlite3.exe
を実行
Macの場合: Macには最初からSQLiteが入っているので、ターミナルで以下を実行するだけ:
sqlite3
Homebrewを使っている場合は、最新版をインストール:
brew install sqlite
Linuxの場合:
# Ubuntuの場合
sudo apt install sqlite3
# CentOSの場合
sudo yum install sqlite
初めてのSQLite体験
ターミナル(コマンドプロンプト)を開いて、以下を入力してみましょう:
sqlite3
こんな画面が出れば成功です:
SQLite version 3.39.4 2022-09-29 15:55:41
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
この sqlite>
が表示されたら、SQLiteが起動している証拠です!
終了方法
SQLiteを終了するには:
.quit
または
.exit
先頭のドットは忘れないようにしてください。
困ったときのヘルプ
SQLiteの中でわからないことがあったら:
.help
これで利用できるコマンドの一覧が表示されます。
環境の準備ができたら、次は実際にデータベースを作って、データを保存してみましょう。
初めてのデータベース作成
データベースファイルを作ってみよう
SQLiteでは、データベースを作ることがとても簡単です。
sqlite3 my_first_database.db
コマンドの説明:
sqlite3
:SQLiteを起動するコマンドmy_first_database.db
:作りたいデータベースファイルの名前
このコマンドを実行すると、my_first_database.db
というファイルが作られて、SQLiteが起動します。
テーブルを作ってみよう
データベースができたら、次は「テーブル」というデータを入れる箱を作ります。
例:友達の連絡先を管理するテーブル
CREATE TABLE friends (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
phone TEXT,
email TEXT,
age INTEGER
);
コードの説明:
CREATE TABLE
:「テーブルを作ります」という命令friends
:テーブルの名前id INTEGER PRIMARY KEY
:番号(自動で1、2、3…と増える)name TEXT NOT NULL
:名前(文字、必須)phone TEXT
:電話番号(文字、任意)email TEXT
:メールアドレス(文字、任意)age INTEGER
:年齢(数字、任意)
データを入れてみよう
テーブルができたら、実際にデータを入れてみます:
INSERT INTO friends (name, phone, email, age)
VALUES ('田中太郎', '090-1234-5678', 'tanaka@example.com', 25);
INSERT INTO friends (name, phone, email, age)
VALUES ('佐藤花子', '080-9876-5432', 'sato@example.com', 22);
INSERT INTO friends (name, phone, age)
VALUES ('鈴木一郎', '070-1111-2222', 30);
コードの説明:
INSERT INTO
:「データを入れます」という命令friends
:入れ先のテーブル名(name, phone, email, age)
:入れるデータの項目VALUES
:実際の値
データを確認してみよう
入れたデータを見てみましょう:
SELECT * FROM friends;
実行結果:
1|田中太郎|090-1234-5678|tanaka@example.com|25
2|佐藤花子|080-9876-5432|sato@example.com|22
3|鈴木一郎|070-1111-2222||30
コードの説明:
SELECT
:「データを取り出します」という命令*
:「すべての項目」という意味FROM friends
:「friendsテーブルから」という意味
もっと見やすく表示する
データをもっと見やすく表示するには:
.mode column
.headers on
SELECT * FROM friends;
実行結果:
id name phone email age
-- -------- -------------- ------------------ ---
1 田中太郎 090-1234-5678 tanaka@example.com 25
2 佐藤花子 080-9876-5432 sato@example.com 22
3 鈴木一郎 070-1111-2222 30
ずっと見やすくなりましたね!
条件を指定してデータを取り出す
特定の条件でデータを探してみましょう:
-- 25歳以上の友達を探す
SELECT * FROM friends WHERE age >= 25;
-- 名前に「田中」が含まれる友達を探す
SELECT * FROM friends WHERE name LIKE '%田中%';
-- 名前と年齢だけを表示
SELECT name, age FROM friends;
データを更新する
友達の情報が変わったときの更新方法:
-- 田中太郎さんの年齢を26歳に変更
UPDATE friends SET age = 26 WHERE name = '田中太郎';
-- 佐藤花子さんのメールアドレスを変更
UPDATE friends SET email = 'hanako.sato@newmail.com' WHERE name = '佐藤花子';
データを削除する
-- 特定の友達を削除
DELETE FROM friends WHERE name = '鈴木一郎';
-- 全部のデータを削除(注意!)
DELETE FROM friends;
これで基本的なCRUD操作(Create作成、Read読取、Update更新、Delete削除)ができるようになりました。
PythonでSQLiteを使ってみよう

なぜPythonでSQLiteを使うの?
手でコマンドを入力するのも良いですが、プログラムから自動でデータを処理できると、もっと便利になります。
PythonはSQLiteとの相性がとても良く、標準でSQLiteを使う機能が入っています。
基本的な接続と操作
import sqlite3
# データベースに接続(ファイルがなければ自動で作成される)
conn = sqlite3.connect('example.db')
# カーソルオブジェクトを作成(SQLを実行するためのツール)
cursor = conn.cursor()
# テーブルを作成
cursor.execute('''
CREATE TABLE IF NOT EXISTS students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
subject TEXT,
score INTEGER
)
''')
# データを保存
conn.commit()
print("データベースとテーブルが作成されました!")
# 接続を閉じる
conn.close()
コードの説明:
sqlite3.connect()
:データベースファイルに接続cursor()
:SQLコマンドを実行するためのツールCREATE TABLE IF NOT EXISTS
:テーブルがなければ作成commit()
:変更を確定して保存close()
:接続を終了
データを追加する関数
import sqlite3
def add_student(name, subject, score):
"""学生のデータを追加する関数"""
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute('''
INSERT INTO students (name, subject, score)
VALUES (?, ?, ?)
''', (name, subject, score))
conn.commit()
conn.close()
print(f"{name}さんのデータを追加しました")
# 実際に使ってみる
add_student("山田太郎", "数学", 85)
add_student("田中花子", "英語", 92)
add_student("佐藤次郎", "数学", 78)
重要なポイント:
?
を使ってデータを安全に挿入(SQLインジェクション対策)- 関数にすることで、何度でも使える
データを取得する関数
def get_all_students():
"""すべての学生データを取得する関数"""
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM students')
students = cursor.fetchall() # すべてのデータを取得
conn.close()
return students
def get_students_by_subject(subject):
"""特定の科目の学生を取得する関数"""
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM students WHERE subject = ?', (subject,))
students = cursor.fetchall()
conn.close()
return students
# 実際に使ってみる
print("全学生のデータ:")
all_students = get_all_students()
for student in all_students:
print(f"ID: {student[0]}, 名前: {student[1]}, 科目: {student[2]}, 点数: {student[3]}")
print("\n数学の学生のデータ:")
math_students = get_students_by_subject("数学")
for student in math_students:
print(f"名前: {student[1]}, 点数: {student[3]}")
より実用的な例:成績管理システム
import sqlite3
from datetime import datetime
class GradeManager:
def __init__(self, db_name='grades.db'):
self.db_name = db_name
self.setup_database()
def setup_database(self):
"""データベースとテーブルをセットアップ"""
conn = sqlite3.connect(self.db_name)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS grades (
id INTEGER PRIMARY KEY,
student_name TEXT NOT NULL,
subject TEXT NOT NULL,
score INTEGER NOT NULL,
max_score INTEGER DEFAULT 100,
date_recorded TEXT,
notes TEXT
)
''')
conn.commit()
conn.close()
def add_grade(self, student_name, subject, score, max_score=100, notes=""):
"""成績を追加"""
conn = sqlite3.connect(self.db_name)
cursor = conn.cursor()
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cursor.execute('''
INSERT INTO grades (student_name, subject, score, max_score, date_recorded, notes)
VALUES (?, ?, ?, ?, ?, ?)
''', (student_name, subject, score, max_score, current_time, notes))
conn.commit()
conn.close()
print(f"{student_name}さんの{subject}の成績を記録しました")
def get_student_average(self, student_name):
"""特定の学生の平均点を計算"""
conn = sqlite3.connect(self.db_name)
cursor = conn.cursor()
cursor.execute('''
SELECT AVG(CAST(score AS FLOAT) / max_score * 100) as average
FROM grades
WHERE student_name = ?
''', (student_name,))
result = cursor.fetchone()
conn.close()
if result and result[0]:
return round(result[0], 2)
return 0
def get_subject_ranking(self, subject):
"""科目別ランキングを取得"""
conn = sqlite3.connect(self.db_name)
cursor = conn.cursor()
cursor.execute('''
SELECT student_name,
AVG(CAST(score AS FLOAT) / max_score * 100) as average
FROM grades
WHERE subject = ?
GROUP BY student_name
ORDER BY average DESC
''', (subject,))
results = cursor.fetchall()
conn.close()
return results
def show_all_grades(self):
"""すべての成績を表示"""
conn = sqlite3.connect(self.db_name)
cursor = conn.cursor()
cursor.execute('''
SELECT student_name, subject, score, max_score, date_recorded
FROM grades
ORDER BY date_recorded DESC
''')
grades = cursor.fetchall()
conn.close()
print("=== 成績一覧 ===")
for grade in grades:
percentage = round((grade[2] / grade[3]) * 100, 1)
print(f"{grade[0]} | {grade[1]} | {grade[2]}/{grade[3]} ({percentage}%) | {grade[4]}")
# 実際に使ってみる
gm = GradeManager()
# 成績を追加
gm.add_grade("山田太郎", "数学", 85, 100, "中間テスト")
gm.add_grade("山田太郎", "英語", 92, 100, "期末テスト")
gm.add_grade("田中花子", "数学", 78, 100, "中間テスト")
gm.add_grade("田中花子", "英語", 88, 100, "期末テスト")
# 平均点を確認
print(f"山田太郎さんの平均点: {gm.get_student_average('山田太郎')}%")
# 数学のランキング
print("\n=== 数学ランキング ===")
math_ranking = gm.get_subject_ranking("数学")
for i, (name, avg) in enumerate(math_ranking, 1):
print(f"{i}位: {name} - {avg:.1f}%")
# 全成績表示
gm.show_all_grades()
このように、PythonとSQLiteを組み合わせることで、実用的なアプリケーションを作ることができます。
SQLiteの注意点と使いどころ

SQLiteが得意なこと・苦手なこと
SQLiteが得意なこと:
- 一人で使うアプリケーション
- 軽量なWebアプリケーション
- デスクトップアプリのデータ保存
- 設定ファイルの代わり
- 学習用のデータベース練習
- プロトタイプ(試作品)の開発
SQLiteが苦手なこと:
- 大量のユーザーが同時にアクセスするシステム
- 巨大なデータ(数百GB以上)の管理
- 複雑なユーザー権限管理
- 高度なデータ分析機能
具体的な注意点
1. 同時書き込みの制限
# 同時に複数のプロセスが書き込むと問題になる場合がある
# 解決策:適切なタイミングでcommit()を行う
import sqlite3
import threading
import time
def safe_write(data):
max_retries = 3
for attempt in range(max_retries):
try:
conn = sqlite3.connect('data.db', timeout=10.0)
cursor = conn.cursor()
cursor.execute("INSERT INTO data_table VALUES (?)", (data,))
conn.commit()
conn.close()
break
except sqlite3.OperationalError:
if attempt < max_retries - 1:
time.sleep(0.1 * (attempt + 1)) # 少し待ってリトライ
else:
raise
2. ファイルサイズの管理
# データベースファイルのサイズを確認する方法
import os
def check_db_size(db_path):
if os.path.exists(db_path):
size_bytes = os.path.getsize(db_path)
size_mb = size_bytes / (1024 * 1024)
print(f"データベースサイズ: {size_mb:.2f} MB")
# 1GB を超えたら警告
if size_mb > 1000:
print("警告: データベースが大きくなっています。最適化を検討してください。")
check_db_size('my_database.db')
3. バックアップの重要性
import shutil
from datetime import datetime
def backup_database(source_db, backup_dir='backups'):
"""データベースのバックアップを作成"""
import os
# バックアップディレクトリを作成
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
# タイムスタンプ付きのバックアップファイル名
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_name = f"backup_{timestamp}.db"
backup_path = os.path.join(backup_dir, backup_name)
# ファイルをコピー
shutil.copy2(source_db, backup_path)
print(f"バックアップを作成しました: {backup_path}")
# 使用例
backup_database('my_database.db')
他のデータベースへの移行
SQLiteで始めて、後で他のデータベースに移行することも可能です:
# SQLiteから他のDBへの移行例(概念的な例)
def migrate_to_postgresql():
"""SQLiteのデータをPostgreSQLに移行する例"""
import sqlite3
# import psycopg2 # PostgreSQL用ライブラリ
# SQLiteからデータを取得
sqlite_conn = sqlite3.connect('source.db')
sqlite_cursor = sqlite_conn.cursor()
sqlite_cursor.execute("SELECT * FROM users")
users = sqlite_cursor.fetchall()
print(f"{len(users)}件のユーザーデータを移行準備完了")
# PostgreSQLに挿入(実際には psycopg2 を使用)
# pg_conn = psycopg2.connect(...)
# pg_cursor = pg_conn.cursor()
# for user in users:
# pg_cursor.execute("INSERT INTO users VALUES (%s, %s, %s)", user)
sqlite_conn.close()
print("移行完了")
まとめ
SQLiteについて、基本から実践的な使い方まで詳しく解説しました。
この記事で学んだこと:
SQLiteの基本:
- 軽量でサーバー不要のデータベース
- 1つのファイルにすべてのデータを保存
- インストールが簡単で、すぐに使い始められる
- スマホアプリやWebアプリで広く使用
基本操作:
- データベースとテーブルの作成
- データの挿入、取得、更新、削除(CRUD操作)
- SQLコマンドの基本的な書き方
- 条件指定での検索方法
注意点と対策:
- 同時書き込みの制限とその対策
- ファイルサイズ管理の重要性
- バックアップの取り方
- 適切な使用場面の見極め
覚えておきたい基本コマンド:
-- テーブル作成
CREATE TABLE テーブル名 (列名 型, ...);
-- データ挿入
INSERT INTO テーブル名 (列名, ...) VALUES (値, ...);
-- データ取得
SELECT * FROM テーブル名;
SELECT 列名 FROM テーブル名 WHERE 条件;
-- データ更新
UPDATE テーブル名 SET 列名 = 値 WHERE 条件;
-- データ削除
DELETE FROM テーブル名 WHERE 条件;
コメント