[Python] SQLite3の使い方 – SQLiteデータベースの基本操作を解説
SQLite3はPythonに標準搭載されているライブラリで、軽量なデータベース管理システムSQLiteを操作できます。
基本操作には、データベースへの接続、テーブルの作成、データの挿入・取得・更新・削除があります。
sqlite3.connect()
でデータベースに接続し、カーソルオブジェクトを用いてSQL文を実行します。
操作後はcommit()
で変更を保存し、close()
で接続を終了します。
SQLite3とは
SQLite3は、軽量で自己完結型のリレーショナルデータベース管理システム(RDBMS)です。
以下の特徴があります。
特徴 | 説明 |
---|---|
軽量 | インストール不要で、アプリケーションに組み込むことができる。 |
自己完結型 | データベースは単一のファイルとして保存される。 |
クロスプラットフォーム | Windows、macOS、Linuxなど、さまざまなOSで動作する。 |
SQLサポート | 標準的なSQL文法を使用してデータ操作が可能。 |
トランザクション対応 | ACID(Atomicity, Consistency, Isolation, Durability)をサポート。 |
SQLite3は、特に小規模なアプリケーションやプロトタイプの開発に適しており、データの保存や管理が簡単に行えます。
Pythonでは、標準ライブラリとしてSQLite3モジュールが提供されており、手軽にデータベース操作を行うことができます。
SQLite3を使う準備
SQLite3を使用するための準備は非常に簡単です。
Pythonには標準ライブラリとしてSQLite3モジュールが含まれているため、特別なインストールは不要です。
以下の手順で準備を進めます。
- Pythonのインストール: Pythonがインストールされていることを確認します。
公式サイトから最新のPythonをダウンロードしてインストールします。
- SQLite3モジュールのインポート: Pythonスクリプト内でSQLite3モジュールをインポートします。
以下は、SQLite3モジュールをインポートするためのサンプルコードです。
import sqlite3
# SQLite3のバージョンを表示
print("SQLite3のバージョン:", sqlite3.sqlite_version)
このコードを実行すると、SQLite3のバージョンが表示されます。
SQLite3のバージョン: 3.36.0
SQLite3を使う準備が整ったら、データベースの作成やテーブルの操作に進むことができます。
SQLiteデータベースへの接続
SQLiteデータベースに接続するためには、sqlite3.connect()
関数を使用します。
この関数にデータベースファイルのパスを指定することで、データベースに接続できます。
データベースファイルが存在しない場合は、新たに作成されます。
以下は、SQLiteデータベースに接続するためのサンプルコードです。
import sqlite3
# データベースに接続(存在しない場合は新規作成)
connection = sqlite3.connect('example.db')
# 接続が成功したか確認
if connection:
print("データベースに接続しました。")
else:
print("データベースへの接続に失敗しました。")
# 接続を閉じる
connection.close()
このコードを実行すると、データベースに接続したことが確認できます。
データベースに接続しました。
接続が成功した後は、データベースに対してさまざまな操作を行うことができます。
接続が不要になった場合は、必ずconnection.close()
を呼び出して接続を閉じることが重要です。
これにより、リソースの無駄遣いを防ぎます。
テーブルの作成
SQLiteデータベースに接続した後、データを格納するためのテーブルを作成する必要があります。
テーブルは、データの構造を定義するもので、カラム(列)とそのデータ型を指定します。
テーブルを作成するには、CREATE TABLE
SQL文を使用します。
以下は、users
という名前のテーブルを作成するためのサンプルコードです。
このテーブルには、id
、name
、age
の3つのカラムがあります。
import sqlite3
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# テーブルを作成するSQL文
create_table_query = '''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER NOT NULL
);
'''
# テーブルを作成
cursor.execute(create_table_query)
# 変更を保存
connection.commit()
# 接続を閉じる
connection.close()
print("テーブル 'users' を作成しました。")
このコードを実行すると、users
テーブルが作成されます。
テーブルがすでに存在する場合は、IF NOT EXISTS
句によりエラーを回避します。
テーブル 'users' を作成しました。
テーブルを作成した後は、データの挿入や取得などの操作を行うことができます。
テーブルの設計は、アプリケーションの要件に応じて適切に行うことが重要です。
データの挿入
SQLiteデータベースにテーブルを作成した後、データをそのテーブルに挿入することができます。
データの挿入には、INSERT INTO
SQL文を使用します。
以下のサンプルコードでは、users
テーブルに新しいユーザーのデータを挿入します。
import sqlite3
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# データを挿入するSQL文
insert_query = '''
INSERT INTO users (name, age) VALUES (?, ?);
'''
# データの挿入
cursor.execute(insert_query, ('山田太郎', 30))
cursor.execute(insert_query, ('佐藤花子', 25))
# 変更を保存
connection.commit()
# 接続を閉じる
connection.close()
print("データを挿入しました。")
このコードを実行すると、users
テーブルに2つの新しいレコードが挿入されます。
?
はプレースホルダーで、実際の値はexecute
メソッドの第2引数として渡されます。
これにより、SQLインジェクション攻撃を防ぐことができます。
データを挿入しました。
データの挿入が完了したら、次は挿入したデータを取得する操作に進むことができます。
データベースにデータを追加する際は、適切なエラーハンドリングを行うことも重要です。
データの取得
SQLiteデータベースに挿入したデータを取得するには、SELECT
SQL文を使用します。
以下のサンプルコードでは、users
テーブルから全てのユーザーのデータを取得し、表示します。
import sqlite3
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# データを取得するSQL文
select_query = '''
SELECT * FROM users;
'''
# データの取得
cursor.execute(select_query)
# 取得したデータを全て取得
rows = cursor.fetchall()
# 取得したデータを表示
for row in rows:
print(f"ID: {row[0]}, 名前: {row[1]}, 年齢: {row[2]}")
# 接続を閉じる
connection.close()
このコードを実行すると、users
テーブルに格納されている全てのユーザーの情報が表示されます。
fetchall()
メソッドを使用することで、全ての行をリストとして取得できます。
ID: 1, 名前: 山田太郎, 年齢: 30
ID: 2, 名前: 佐藤花子, 年齢: 25
データの取得は、特定の条件に基づいて行うことも可能です。
例えば、特定の年齢以上のユーザーを取得する場合は、WHERE
句を使用します。
データベースから必要な情報を効率的に取得するために、適切なクエリを設計することが重要です。
データの更新
SQLiteデータベースに格納されているデータを更新するには、UPDATE
SQL文を使用します。
以下のサンプルコードでは、users
テーブル内の特定のユーザーの年齢を更新します。
import sqlite3
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# データを更新するSQL文
update_query = '''
UPDATE users
SET age = ?
WHERE name = ?;
'''
# 年齢を更新
cursor.execute(update_query, (31, '山田太郎'))
# 変更を保存
connection.commit()
# 更新が成功したか確認
if cursor.rowcount > 0:
print("データを更新しました。")
else:
print("更新するデータが見つかりませんでした。")
# 接続を閉じる
connection.close()
このコードを実行すると、山田太郎
の年齢が31
に更新されます。
SET
句で更新するカラムと新しい値を指定し、WHERE
句でどのレコードを更新するかを指定します。
データを更新しました。
データの更新を行う際は、WHERE
句を使用して特定のレコードを指定することが重要です。
指定しない場合、全てのレコードが更新されてしまうため、注意が必要です。
また、更新後はcursor.rowcount
を使用して、実際に更新された行数を確認することができます。
データの削除
SQLiteデータベースからデータを削除するには、DELETE
SQL文を使用します。
以下のサンプルコードでは、users
テーブルから特定のユーザーを削除します。
import sqlite3
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# データを削除するSQL文
delete_query = '''
DELETE FROM users
WHERE name = ?;
'''
# ユーザーを削除
cursor.execute(delete_query, ('佐藤花子',))
# 変更を保存
connection.commit()
# 削除が成功したか確認
if cursor.rowcount > 0:
print("データを削除しました。")
else:
print("削除するデータが見つかりませんでした。")
# 接続を閉じる
connection.close()
このコードを実行すると、佐藤花子
という名前のユーザーがusers
テーブルから削除されます。
WHERE
句を使用して、削除するレコードを特定します。
データを削除しました。
データの削除を行う際も、WHERE
句を使用して特定のレコードを指定することが重要です。
指定しない場合、全てのレコードが削除されてしまうため、注意が必要です。
また、削除後はcursor.rowcount
を使用して、実際に削除された行数を確認することができます。
これにより、意図した通りの操作が行われたかを確認できます。
トランザクション管理
トランザクション管理は、データベース操作の一貫性と整合性を保つために重要です。
SQLiteでは、トランザクションを使用して、複数のデータベース操作を一つの単位として扱うことができます。
トランザクションは、全ての操作が成功した場合にのみコミットされ、失敗した場合はロールバックされます。
これにより、データの整合性が保たれます。
以下は、トランザクションを使用してデータを挿入するサンプルコードです。
import sqlite3
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# トランザクションの開始
try:
# データを挿入するSQL文
insert_query = '''
INSERT INTO users (name, age) VALUES (?, ?);
'''
# 複数のデータを挿入
cursor.execute(insert_query, ('田中一郎', 28))
cursor.execute(insert_query, ('鈴木次郎', 22))
# 変更を保存(コミット)
connection.commit()
print("データを挿入しました。")
except Exception as e:
# エラーが発生した場合はロールバック
connection.rollback()
print("エラーが発生しました:", e)
finally:
# 接続を閉じる
connection.close()
このコードでは、try
ブロック内でデータを挿入し、全ての操作が成功した場合にcommit()
を呼び出して変更を保存します。
もしエラーが発生した場合は、except
ブロックでrollback()
を呼び出し、変更を元に戻します。
データを挿入しました。
トランザクション管理を使用することで、データベースの操作が安全に行えるようになります。
特に、複数の操作が関連している場合や、データの整合性が重要な場合には、トランザクションを活用することが推奨されます。
エラーハンドリング
データベース操作を行う際には、エラーが発生する可能性があります。
エラーハンドリングを適切に行うことで、プログラムの安定性を向上させ、予期しない動作を防ぐことができます。
SQLiteでは、Pythonの例外処理機構を利用してエラーを捕捉し、適切な対応を行うことができます。
以下は、データの挿入時にエラーハンドリングを行うサンプルコードです。
import sqlite3
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# データを挿入するSQL文
insert_query = '''
INSERT INTO users (name, age) VALUES (?, ?);
'''
# エラーハンドリングを行いながらデータを挿入
try:
# 存在しないテーブルにデータを挿入しようとする(エラーを発生させる)
cursor.execute(insert_query, ('佐藤花子', 25))
# 変更を保存
connection.commit()
print("データを挿入しました。")
except sqlite3.Error as e:
# SQLiteのエラーを捕捉
print("SQLiteエラーが発生しました:", e)
except Exception as e:
# その他のエラーを捕捉
print("エラーが発生しました:", e)
finally:
# 接続を閉じる
connection.close()
このコードでは、try
ブロック内でデータを挿入し、エラーが発生した場合はexcept
ブロックでエラーメッセージを表示します。
SQLite特有のエラーはsqlite3.Error
で捕捉し、その他のエラーは一般的なException
で捕捉します。
SQLiteエラーが発生しました: no such table: users
エラーハンドリングを行うことで、プログラムが異常終了することを防ぎ、エラーの原因を特定しやすくなります。
データベース操作を行う際は、必ずエラーハンドリングを実装することが推奨されます。
これにより、ユーザーに対して適切なフィードバックを提供し、データの整合性を保つことができます。
応用的な操作
SQLiteを使用する際には、基本的な操作に加えて、より応用的な操作を行うことができます。
ここでは、複数のテーブルを使用した結合(JOIN)、サブクエリ、インデックスの作成など、いくつかの応用的な操作について説明します。
テーブルの結合(JOIN)
複数のテーブルからデータを取得するために、JOIN
を使用します。
以下のサンプルコードでは、orders
テーブルとusers
テーブルを結合して、ユーザー名とその注文を取得します。
import sqlite3
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# テーブルの結合を行うSQL文
join_query = '''
SELECT users.name, orders.product
FROM users
JOIN orders ON users.id = orders.user_id;
'''
# データの取得
cursor.execute(join_query)
rows = cursor.fetchall()
# 結果を表示
for row in rows:
print(f"ユーザー: {row[0]}, 注文商品: {row[1]}")
# 接続を閉じる
connection.close()
サブクエリ
サブクエリを使用することで、他のクエリの結果を基にしたデータ取得が可能です。
以下のサンプルコードでは、年齢が最も高いユーザーを取得します。
import sqlite3
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# サブクエリを使用したSQL文
subquery = '''
SELECT name, age
FROM users
WHERE age = (SELECT MAX(age) FROM users);
'''
# データの取得
cursor.execute(subquery)
rows = cursor.fetchall()
# 結果を表示
for row in rows:
print(f"年齢が最も高いユーザー: {row[0]}, 年齢: {row[1]}")
# 接続を閉じる
connection.close()
インデックスの作成
インデックスを作成することで、データの検索速度を向上させることができます。
以下のサンプルコードでは、name
カラムにインデックスを作成します。
import sqlite3
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# インデックスを作成するSQL文
create_index_query = '''
CREATE INDEX idx_user_name ON users (name);
'''
# インデックスを作成
cursor.execute(create_index_query)
# 変更を保存
connection.commit()
# 接続を閉じる
connection.close()
print("インデックスを作成しました。")
これらの応用的な操作を活用することで、SQLiteデータベースの機能を最大限に引き出し、効率的なデータ管理が可能になります。
データベースの設計やクエリの最適化を行うことで、アプリケーションのパフォーマンスを向上させることができます。
SQLiteデータベースの管理
SQLiteデータベースの管理は、データの整合性やパフォーマンスを維持するために重要です。
ここでは、データベースのバックアップ、VACUUMコマンドによるデータベースの最適化、データベースのスキーマ変更、データのエクスポートとインポートについて説明します。
データベースのバックアップ
データベースのバックアップは、データの損失を防ぐために重要です。
SQLiteでは、データベースファイルをコピーすることで簡単にバックアップを作成できます。
以下は、Pythonを使用してデータベースのバックアップを作成するサンプルコードです。
import shutil
# データベースファイルのパス
db_file = 'example.db'
backup_file = 'example_backup.db'
# データベースのバックアップを作成
shutil.copyfile(db_file, backup_file)
print("データベースのバックアップを作成しました。")
VACUUMコマンドによる最適化
SQLiteでは、VACUUM
コマンドを使用してデータベースを最適化し、不要な空き領域を解放することができます。
これにより、データベースのサイズを小さくし、パフォーマンスを向上させることができます。
以下は、VACUUM
コマンドを実行するサンプルコードです。
import sqlite3
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# VACUUMコマンドを実行
cursor.execute('VACUUM;')
# 変更を保存
connection.commit()
# 接続を閉じる
connection.close()
print("データベースを最適化しました。")
データベースのスキーマ変更
データベースのスキーマを変更する場合、ALTER TABLE
文を使用します。
例えば、テーブルに新しいカラムを追加する場合のサンプルコードは以下の通りです。
import sqlite3
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# テーブルに新しいカラムを追加するSQL文
alter_table_query = '''
ALTER TABLE users ADD COLUMN email TEXT;
'''
# スキーマ変更を実行
cursor.execute(alter_table_query)
# 変更を保存
connection.commit()
# 接続を閉じる
connection.close()
print("テーブルに新しいカラムを追加しました。")
データのエクスポートとインポート
SQLiteでは、データをCSVファイルなどにエクスポートしたり、逆にインポートしたりすることができます。
以下は、データをCSVファイルにエクスポートするサンプルコードです。
import sqlite3
import csv
# データベースに接続
connection = sqlite3.connect('example.db')
# カーソルを作成
cursor = connection.cursor()
# データを取得
cursor.execute('SELECT * FROM users;')
rows = cursor.fetchall()
# CSVファイルにエクスポート
with open('users.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['ID', '名前', '年齢', 'メール']) # ヘッダー
writer.writerows(rows)
# 接続を閉じる
connection.close()
print("データをCSVファイルにエクスポートしました。")
これらの管理操作を行うことで、SQLiteデータベースのパフォーマンスを維持し、データの安全性を確保することができます。
定期的なバックアップや最適化を行うことが、データベースの健全性を保つために重要です。
SQLite3を使ったプロジェクト例
SQLite3は、軽量で使いやすいため、さまざまなプロジェクトで利用されています。
ここでは、SQLite3を使用したいくつかのプロジェクト例を紹介します。
これらの例を参考にすることで、SQLite3の活用方法を理解し、自分のプロジェクトに応用することができます。
簡易タスク管理アプリ
SQLite3を使用して、タスクの追加、更新、削除、表示を行う簡易タスク管理アプリを作成できます。
ユーザーはタスクを登録し、進捗状況を管理することができます。
以下は、基本的な機能の概要です。
- テーブル設計:
tasks
テーブルを作成し、タスク名、期限、ステータスを管理。 - 機能:
- タスクの追加
- タスクの表示
- タスクの更新(完了・未完了の切り替え)
- タスクの削除
ショッピングリストアプリ
SQLite3を使用して、ショッピングリストを管理するアプリを作成できます。
ユーザーは購入予定の商品を登録し、購入済みの商品を管理することができます。
以下は、基本的な機能の概要です。
- テーブル設計:
shopping_list
テーブルを作成し、商品名、数量、購入状況を管理。 - 機能:
- 商品の追加
- 商品の表示
- 商品の更新(数量の変更や購入状況の更新)
- 商品の削除
ブログシステム
SQLite3を使用して、簡単なブログシステムを構築することも可能です。
ユーザーは記事を作成し、編集、削除することができます。
以下は、基本的な機能の概要です。
- テーブル設計:
posts
テーブルを作成し、記事タイトル、内容、作成日を管理。 - 機能:
- 記事の作成
- 記事の表示
- 記事の更新
- 記事の削除
学生管理システム
SQLite3を使用して、学生の情報を管理するシステムを作成できます。
学生の成績や出席状況を管理することができます。
以下は、基本的な機能の概要です。
- テーブル設計:
students
テーブルを作成し、学生名、学年、成績を管理。 - 機能:
- 学生の追加
- 学生の表示
- 学生の成績の更新
- 学生の削除
簡易在庫管理システム
SQLite3を使用して、商品の在庫を管理するシステムを構築できます。
商品の入出庫を管理し、在庫状況を把握することができます。
以下は、基本的な機能の概要です。
- テーブル設計:
inventory
テーブルを作成し、商品名、在庫数、入出庫履歴を管理。 - 機能:
- 商品の追加
- 在庫数の更新
- 入出庫履歴の表示
- 商品の削除
これらのプロジェクト例は、SQLite3の基本的な機能を活用したものであり、実際のアプリケーション開発に役立つアイデアを提供します。
SQLite3を使用することで、データベースの管理が容易になり、アプリケーションの開発がスムーズに進むでしょう。
まとめ
この記事では、SQLite3の基本的な使い方から応用的な操作まで、さまざまな機能について詳しく解説しました。
SQLite3は、軽量で使いやすいデータベース管理システムであり、特に小規模なアプリケーションやプロトタイプの開発に適しています。
これを機に、SQLite3を活用したプロジェクトに挑戦してみることで、実践的なスキルを身につけることができるでしょう。