1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonでSQLiteを簡単に操作する方法

1
Last updated at Posted at 2026-05-31

はじめに

個人的に管理しているデータがあり、PythonとSQLiteを使って管理しています。
そのため、今回はPythonでSQLiteを操作する方法を簡単にまとめてみました。

PythonでSQLiteを操作する方法

SQLiteは軽量なデータベースで、複雑な環境を必要とせず、単一のDBファイルでデータを管理できます。
また、Pythonでは標準ライブラリのsqlite3モジュールを使うことで、SQLiteを簡単に操作できます。

以下に、PythonからSQLiteに接続し、データを操作するサンプルコードを記載しておきました。
例として準備したサンプルDBには、「employees」テーブルがあり、以下のようなデータが格納されています。

BEGIN TRANSACTION;
CREATE TABLE employees (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    department TEXT NOT NULL,
    position TEXT NOT NULL,
    salary INTEGER NOT NULL,
    hire_date TEXT NOT NULL
);

INSERT INTO employees VALUES(1,'山田太郎','開発部','社員',3800000,'2021-03-15');
INSERT INTO employees VALUES(2,'佐藤花子','開発部','主任',4500000,'2020-07-20');
INSERT INTO employees VALUES(3,'鈴木一郎','開発部','課長',5800000,'2018-11-01');
INSERT INTO employees VALUES(4,'高橋美咲','営業部','社員',3600000,'2022-01-10');
INSERT INTO employees VALUES(5,'伊藤健太','営業部','主任',4300000,'2020-05-03');
INSERT INTO employees VALUES(6,'渡辺翔','営業部','課長',5500000,'2017-09-18');
INSERT INTO employees VALUES(7,'中村彩','人事部','社員',3500000,'2023-02-01');
INSERT INTO employees VALUES(8,'小林大輔','人事部','主任',4400000,'2019-12-11');
INSERT INTO employees VALUES(9,'加藤優子','経理部','主任',4700000,'2021-06-30');
INSERT INTO employees VALUES(10,'吉田誠','経理部','課長',6200000,'2016-08-22');
COMMIT;

SELECT

employeesテーブルのサンプルデータを取得してみます。
以下の例では、全件取得とIDを指定した検索を行います。

import sqlite3

DB_PATH = "sample.db"

def get_employee_all():
    # DBに接続する
    conn = sqlite3.connect(DB_PATH)
    # SQLクエリから結果を取得するため、カーソルを作成する
    cur = conn.cursor()

    sql = """
        SELECT
            *
        FROM
            employees
    """

    # SQL文を実行して、すべての結果を取得する
    rows = cur.execute(sql).fetchall()

    conn.close()

    return rows


def get_employee_by_id(employee_id):
    # DBに接続する
    conn = sqlite3.connect(DB_PATH)
    # SQLクエリから結果を取得するため、カーソルを作成する
    cur = conn.cursor()

    sql = """
        SELECT
            *
        FROM
            employees
        WHERE
            id = :id
    """

    params = {"id": employee_id}

    # SQL文を実行して、1つの結果を取得する
    row = cur.execute(sql, params).fetchone()

    conn.close()

    return row


def main():
    for row in get_employee_all():
        print(row)

    print("---")

    print(get_employee_by_id(5))


if __name__ == "__main__":
    main()

SQL文に条件を文字列結合せず、パラメーターを使って実行することで、SQLインジェクションのリスクを軽減できます。

sql = """
    SELECT
        *
    FROM
        employees
    WHERE
        id = :id
"""

params = {"id": employee_id}

cur.execute(sql, params)

出力結果

(1, '山田太郎', '開発部', '社員', 3800000, '2021-03-15')
(2, '佐藤花子', '開発部', '主任', 4500000, '2020-07-20')
(3, '鈴木一郎', '開発部', '課長', 5800000, '2018-11-01')
(4, '高橋美咲', '営業部', '社員', 3600000, '2022-01-10')
(5, '伊藤健太', '営業部', '主任', 4300000, '2020-05-03')
(6, '渡辺翔', '営業部', '課長', 5500000, '2017-09-18')
(7, '中村彩', '人事部', '社員', 3500000, '2023-02-01')
(8, '小林大輔', '人事部', '主任', 4400000, '2019-12-11')
(9, '加藤優子', '経理部', '主任', 4700000, '2021-06-30')
(10, '吉田誠', '経理部', '課長', 6200000, '2016-08-22')
# 全件取得の結果
---
(5, '伊藤健太', '営業部', '主任', 4300000, '2020-05-03')
# 1件取得の結果

取得した結果が表示されます。

INSERT

employeesテーブルにサンプルデータを挿入してみます。
idは、INTEGER PRIMARY KEYとして定義しているため、通常はINSERT時に指定しなくても自動採番されます。

INTEGER PRIMARY KEY AUTOINCREMENTを使用すると、IDの再利用は行われませんが、内部的な処理が増えるため通常はINTEGER PRIMARY KEYのみで十分です。

import sqlite3

DB_PATH = "sample.db"

def get_employee_all():
    ...

def insert_employee(name, department, position, salary, hire_date):
    # DBに接続する
    conn = sqlite3.connect(DB_PATH)
    # SQLクエリから結果を取得するため、カーソルを作成する
    cur = conn.cursor()

    sql = """
        INSERT INTO
            employees (
                name,
                department,
                position,
                salary,
                hire_date
            )
        VALUES
            (
                :name,
                :department,
                :position,
                :salary,
                :hire_date
            )
        """

    params = {
        "name": name,
        "department": department,
        "position": position,
        "salary": salary,
        "hire_date": hire_date,
    }

    # SQL文を実行して、データを挿入する
    cur.execute(sql, params)

    # DBをcommitして、変更を反映させる
    conn.commit()
    conn.close()


def main():
    insert_employee("◯◯太郎", "開発部", "社員", 4000000, "2026-05-31")

    employees = get_employee_all()

    for row in employees:
        print(row)


if __name__ == "__main__":
    main()

出力結果

(1, '山田太郎', '開発部', '社員', 3800000, '2021-03-15')
(2, '佐藤花子', '開発部', '主任', 4500000, '2020-07-20')
(3, '鈴木一郎', '開発部', '課長', 5800000, '2018-11-01')
(4, '高橋美咲', '営業部', '社員', 3600000, '2022-01-10')
(5, '伊藤健太', '営業部', '主任', 4300000, '2020-05-03')
(6, '渡辺翔', '営業部', '課長', 5500000, '2017-09-18')
(7, '中村彩', '人事部', '社員', 3500000, '2023-02-01')
(8, '小林大輔', '人事部', '主任', 4400000, '2019-12-11')
(9, '加藤優子', '経理部', '主任', 4700000, '2021-06-30')
(10, '吉田誠', '経理部', '課長', 6200000, '2016-08-22')
(11, '◯◯太郎', '開発部', '社員', 4000000, '2026-05-31') # ← 新規の社員データを追加

入力したデータが追加されました。

UPDATE

employeesテーブルにサンプルデータの給料を更新してみます。

import sqlite3

DB_PATH = "sample.db"

def get_employee_all():
    ...

def update_employee_salary(employee_id, salary):
    # DBに接続する
    conn = sqlite3.connect(DB_PATH)
    # SQLクエリから結果を取得するため、カーソルを作成する
    cur = conn.cursor()

    sql = """
        UPDATE
            employees
        SET
            salary = :salary
        WHERE
            id = :id
        """

    params = {"id": employee_id, "salary": salary}

    # SQL文を実行して、データを更新する
    cur.execute(sql, params)

    # DBをcommitして、変更を反映させる
    conn.commit()
    conn.close()


def main():
    update_employee_salary(11, 5000000)

    employees = get_employee_all()

    for row in employees:
        print(row)


if __name__ == "__main__":
    main()

出力結果

(1, '山田太郎', '開発部', '社員', 3800000, '2021-03-15')
(2, '佐藤花子', '開発部', '主任', 4500000, '2020-07-20')
(3, '鈴木一郎', '開発部', '課長', 5800000, '2018-11-01')
(4, '高橋美咲', '営業部', '社員', 3600000, '2022-01-10')
(5, '伊藤健太', '営業部', '主任', 4300000, '2020-05-03')
(6, '渡辺翔', '営業部', '課長', 5500000, '2017-09-18')
(7, '中村彩', '人事部', '社員', 3500000, '2023-02-01')
(8, '小林大輔', '人事部', '主任', 4400000, '2019-12-11')
(9, '加藤優子', '経理部', '主任', 4700000, '2021-06-30')
(10, '吉田誠', '経理部', '課長', 6200000, '2016-08-22')
(11, '◯◯太郎', '開発部', '社員', 5000000, '2026-05-31') # ← 給料を"4000000"から"5000000"に更新

入力したデータが更新されました。

DELETE

employeesテーブルにサンプルデータを削除してみます。

import sqlite3

DB_PATH = "sample.db"

def get_employee_all():
    ...

def delete_employee(employee_id):
    # DBに接続する
    conn = sqlite3.connect(DB_PATH)
    # SQLクエリから結果を取得するため、カーソルを作成する
    cur = conn.cursor()

    sql = """
        DELETE FROM
            employees
        WHERE
            id = :id
        """

    params = {"id": employee_id}

    # SQL文を実行して、データを削除する
    cur.execute(sql, params)

    # DBをcommitして、変更を反映させる
    conn.commit()
    conn.close()


def main():
    delete_employee(11)

    employees = get_employee_all()

    for row in employees:
        print(row)


if __name__ == "__main__":
    main()

出力結果

(1, '山田太郎', '開発部', '社員', 3800000, '2021-03-15')
(2, '佐藤花子', '開発部', '主任', 4500000, '2020-07-20')
(3, '鈴木一郎', '開発部', '課長', 5800000, '2018-11-01')
(4, '高橋美咲', '営業部', '社員', 3600000, '2022-01-10')
(5, '伊藤健太', '営業部', '主任', 4300000, '2020-05-03')
(6, '渡辺翔', '営業部', '課長', 5500000, '2017-09-18')
(7, '中村彩', '人事部', '社員', 3500000, '2023-02-01')
(8, '小林大輔', '人事部', '主任', 4400000, '2019-12-11')
(9, '加藤優子', '経理部', '主任', 4700000, '2021-06-30')
(10, '吉田誠', '経理部', '課長', 6200000, '2016-08-22')
# ID=11 の社員データが削除されて、表示されない

入力したデータが削除されました。

おわりに

Pythonでは、SQLiteを操作するためのsqlite3モジュールを使って、データベースを扱うことができます。
今回は、SQLiteの基本的な操作を行うサンプルコードを作成してみました。
基本的な操作であれば、記載したサンプルコードを活用することで十分対応できると思います。
また、Python標準ライブラリのTkinterを使ってGUIを作成すれば、DBを手軽に管理できるツールも作れます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?