※この記事にはアフィリエイトリンクを含みます(PR)

どうも、AIツール実践者兼SEOライターの「ぷーた」です。

皆さんは、日々の業務や趣味で、データを管理したり、繰り返し作業を自動化したりする際に、どんなツールを使っていますか? ExcelやCSVファイルも便利ですが、データ量が増えたり、複雑な検索や更新が必要になったりすると、管理が煩雑になりがちですよね。

そこで自分が最近ヘビーローテーションで活用しているのが、PythonとSQLiteの組み合わせです。これ、本当に便利なんです。

「データベースって聞くと難しそう…」 「PythonでSQLiteなんて、プログラミング上級者向けなんじゃ…」

そう思われた方もいるかもしれません。でも、安心してください! SQLiteは、特別なサーバーが不要で、ファイル一つで完結する軽量なデータベースなので、Pythonとの連携も非常にシンプルです。自分が実際に使ってみて、「もっと早く知りたかった!」と強く感じたので、今回はその魅力を、初心者の方にもわかりやすく、具体的な使い方と共にお伝えしたいと思います。

この記事を読めば、

  • SQLiteとPythonの連携方法がわかる
  • 基本的なデータベース操作(作成、テーブル作成、データ挿入、検索、更新、削除)ができるようになる
  • Pythonを使ったデータ自動化の第一歩が踏み出せる

という状態を目指せます。さあ、あなたもPythonでデータ管理・自動化の扉を開きましょう!

SQLiteとは? Pythonで扱うメリット

まず、SQLiteとは一体何なのか、そしてなぜPythonで使うと便利なのかを簡単に説明しておきましょう。

SQLiteは、サーバーを必要としない、ファイルベースのリレーショナルデータベース管理システム(RDBMS)です。つまり、データベースを操作するための特別なソフトウェアをインストールしたり、設定したりする必要がなく、単一のファイル(.db.sqlite拡張子が多い)として存在します。この手軽さが最大の魅力です。

Pythonには、標準ライブラリとしてsqlite3モジュールが組み込まれています。つまり、Pythonさえインストールされていれば、追加のライブラリをインストールすることなく、すぐにSQLiteを操作できるのです。

自分がPythonとSQLiteを使い始めたのは、Webスクレイピングで取得した大量のデータを効率的に保存・管理したかったからです。Excelだと管理しきれなくなったデータも、SQLiteなら構造化して保存できるので、後から必要な情報だけを瞬時に取り出せます。さらに、Pythonの強力なデータ処理能力と組み合わせることで、

  • 定期的なデータ収集とデータベースへの自動登録
  • 特定の条件に合致するデータの抽出とレポート作成
  • Webアプリケーションのバックエンドとしてデータの永続化

など、様々な自動化や効率化が可能になります。

PythonでSQLiteデータベースを操作する基本手順

では、具体的にPythonでSQLiteをどう使うのか、基本的な流れを見ていきましょう。自分はいつも以下のステップで作業を進めています。

1. SQLiteデータベースへの接続

まずは、Pythonのsqlite3モジュールを使って、データベースファイルに接続(または新規作成)します。コードは非常にシンプルです。

import sqlite3

# データベースファイル名(存在しない場合は新規作成されます)
db_file = 'my_database.db'

try:
    # データベースに接続
    conn = sqlite3.connect(db_file)
    print(f"'{db_file}' への接続に成功しました。")

    # カーソルオブジェクトを作成(SQL文を実行するために必要)
    cursor = conn.cursor()

except sqlite3.Error as e:
    print(f"データベースエラー: {e}")

finally:
    # 接続を閉じる(通常は処理の最後に)
    if conn:
        conn.close()
        print("データベース接続を閉じました。")

このコードを実行すると、my_database.dbという名前のファイルがカレントディレクトリに作成(または既存のファイルに接続)されます。connオブジェクトがデータベースとの接続を表し、cursorオブジェクトを使ってSQLコマンドを実行します。

ポイント: sqlite3.connect()に渡すファイル名で、データベースが作成されるか既存のものに接続されるかが決まります。コードの最後にconn.close()で接続を閉じるのが、リソース管理の基本です。ただし、with文を使うと、より安全かつ簡潔に接続を管理できます。

import sqlite3

db_file = 'my_database.db'

# 'with'文を使うと、ブロックを抜ける際に自動的にコミットまたはロールバック、そして接続が閉じられます。
try:
    with sqlite3.connect(db_file) as conn:
        cursor = conn.cursor()
        print(f"'{db_file}' への接続を管理しています(with文)。")
        # ここでデータベース操作を行う

    print("withブロックを抜けました。接続は自動的に閉じられます。")

except sqlite3.Error as e:
    print(f"データベースエラー: {e}")

自分は最近、このwith文を使うようにして、コードがスッキリしました。

2. テーブルの作成

データベースにデータを保存するには、まず「テーブル」を作成する必要があります。テーブルは、Excelのシートのようなもので、行と列から構成されます。列にはそれぞれ名前とデータ型(整数、文字列、NULLなど)を指定します。

例えば、簡単な「ユーザー情報」テーブルを作成してみましょう。

import sqlite3

db_file = 'my_database.db'

try:
    with sqlite3.connect(db_file) as conn:
        cursor = conn.cursor()

        # テーブル作成 (IF NOT EXISTS で、既に存在する場合にエラーにならないようにする)
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS users (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT NOT NULL,
                age INTEGER,
                email TEXT UNIQUE
            )
        ''')
        print("テーブル 'users' を作成(または確認)しました。")

except sqlite3.Error as e:
    print(f"データベースエラー: {e}")

このコードでは、

  • CREATE TABLE IF NOT EXISTS users (...)users という名前のテーブルを作成しています。
  • id INTEGER PRIMARY KEY AUTOINCREMENT: 自動的に連番が振られる主キー(レコードを識別するユニークな値)です。
  • name TEXT NOT NULL: 必須の文字列型カラム。
  • age INTEGER: 整数型カラム。
  • email TEXT UNIQUE: メールアドレス。重複する値は許可されません。

cursor.execute()メソッドにSQL文を文字列として渡すことで、データベースに命令を実行させます。

3. データの挿入 (INSERT)

テーブルができたら、データを挿入(追加)できます。

import sqlite3

db_file = 'my_database.db'

try:
    with sqlite3.connect(db_file) as conn:
        cursor = conn.cursor()

        # データ挿入
        cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", ('Alice', 30, 'alice@example.com'))
        cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", ('Bob', 25, 'bob@example.com'))
        cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", ('Charlie', 35, 'charlie@example.com'))

        # 複数のデータを一度に挿入 (executemany)
        new_users = [
            ('David', 28, 'david@example.com'),
            ('Eve', 22, 'eve@example.com')
        ]
        cursor.executemany("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", new_users)

        # 変更をコミット(保存)
        conn.commit() # 'with'文を使わない場合は、明示的にcommit()が必要
        print("データを挿入しました。")

except sqlite3.Error as e:
    print(f"データベースエラー: {e}")

ここで重要なのが、VALUES (?, ?, ?) の部分です。これは「プレースホルダ」と呼ばれるもので、直接SQL文の中に値を埋め込むのではなく、タプルなどで安全に渡すことができます。SQLインジェクション攻撃を防ぐためにも、この方法を使うのが一般的です。

conn.commit()は、データベースへの変更を確定(保存)させるための命令です。with文を使わない場合は、これを忘れるとデータが保存されないので注意しましょう。

4. データの検索 (SELECT)

保存したデータを取り出すのは、データベース操作の基本中の基本です。

import sqlite3

db_file = 'my_database.db'

try:
    with sqlite3.connect(db_file) as conn:
        cursor = conn.cursor()

        # 全てのユーザー情報を取得
        print("\
--- 全ユーザー情報 --- ")
        cursor.execute("SELECT id, name, age, email FROM users")
        rows = cursor.fetchall() # 全ての行を取得
        for row in rows:
            print(row) # 各行はタプルとして取得される

        # 特定の条件でユーザー情報を取得(例: 年齢が30歳以上のユーザー)
        print("\
--- 年齢30歳以上のユーザー --- ")
        target_age = 30
        cursor.execute("SELECT name, email FROM users WHERE age >= ?", (target_age,))
        filtered_rows = cursor.fetchmany(2) # 最大2行取得
        for row in filtered_rows:
            print(row)

        # 一件だけ取得
        print("\
--- IDが1のユーザー --- ")
        cursor.execute("SELECT * FROM users WHERE id = ?", (1,))
        single_row = cursor.fetchone() # 一行だけ取得
        if single_row:
            print(single_row)

except sqlite3.Error as e:
    print(f"データベースエラー: {e}")
  • SELECT ... FROM users: usersテーブルから指定したカラムを選択します。
  • WHERE age >= ?: 条件を指定します。ここでもプレースホルダを使用します。
  • cursor.fetchall(): 条件に合う全てのレコード(行)をリ

※この記事にはアフィリエイトリンクを含みます(PR)

記事で紹介したツール

  • Python — プログラミング言語 — 入門書