データベース

[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モジュールが含まれているため、特別なインストールは不要です。

以下の手順で準備を進めます。

  1. Pythonのインストール: Pythonがインストールされていることを確認します。

公式サイトから最新のPythonをダウンロードしてインストールします。

  1. 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という名前のテーブルを作成するためのサンプルコードです。

このテーブルには、idnameageの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を活用したプロジェクトに挑戦してみることで、実践的なスキルを身につけることができるでしょう。

Back to top button