SQLiteとは?超入門ガイド|初心者が知っておくべき基礎と実用例

データベース・SQL

プログラミングを始めたばかりの方は、こんなことを思ったことがありませんか?

  • 「アプリでデータを保存したいけど、どうすればいいの?」
  • 「データベースって難しそう…」
  • 「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の場合

  1. SQLite公式サイトにアクセス
  2. 「Precompiled Binaries for Windows」から「sqlite-tools-win32-x86」をダウンロード
  3. ダウンロードしたZIPファイルを解凍
  4. 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 条件;

コメント

タイトルとURLをコピーしました