はじめに
個人的に管理しているデータがあり、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を手軽に管理できるツールも作れます。