Python標準ライブラリの sqlite3 を使用すると、別途サーバーを立てることなく、ローカルファイルやメモリ上で動作する軽量なリレーショナルデータベースを作成・操作できます。
ここでは、データベースファイル(永続化)への接続方法と、データ保存しない一時的なオンメモリデータベースへの接続方法を解説します。
1. ファイルデータベースへの接続と切断
ローカル上のファイル(例: employees.db)を指定して接続します。ファイルが存在しない場合は自動的に新規作成されます。
処理が終わったら必ず .close() メソッドを呼び出して接続を閉じる必要があります。これにより、データベースロックの解放やリソースのクリーンアップが行われます。
ソースコード
import sqlite3
import os
# データベースファイル名(拡張子は .db や .sqlite3 が一般的)
db_path = "company_data.db"
print(f"--- 接続処理: {db_path} ---")
# 1. データベースへの接続
# sqlite3.connect(パス) でコネクションオブジェクトを生成します
connection = sqlite3.connect(db_path)
try:
# 2. カーソルの作成(SQLを実行するためのオブジェクト)
cursor = connection.cursor()
# 接続確認: SQLiteのバージョンを取得してみる
cursor.execute("SELECT sqlite_version();")
version = cursor.fetchone()
print(f"SQLiteバージョン: {version[0]}")
print("データベース接続に成功しました。")
# ここでテーブル作成やデータ操作を行います...
except sqlite3.Error as e:
print(f"エラーが発生しました: {e}")
finally:
# 3. 接続のクローズ
# エラーの有無にかかわらず、最後に必ず閉じます
if connection:
connection.close()
print("接続を閉じました。")
# 実行後にファイルが生成されているか確認
if os.path.exists(db_path):
print(f"確認: '{db_path}' が現在のディレクトリに存在します。")
実行結果
--- 接続処理: company_data.db ---
SQLiteバージョン: 3.42.0
データベース接続に成功しました。
接続を閉じました。
確認: 'company_data.db' が現在のディレクトリに存在します。
2. オンメモリデータベースへの接続 (:memory:)
ファイルを作成せず、メインメモリ(RAM)上でのみ動作するデータベースを作成するには、接続時のパスに特殊なキーワード ":memory:" を指定します。
プログラムが終了したり接続を閉じたりすると、データはすべて消滅します。テストコードの実行や、一時的なデータ加工処理に最適です。
ソースコード
import sqlite3
print("--- オンメモリDBの利用 ---")
# 特殊な名前 ":memory:" を指定
# with文を使うと、ブロックを抜けた際のコミット/ロールバック制御が行われます
# ※注意: connectのwith文は自動close()を行わない仕様のため、明示的なcloseが推奨されますが、
# オンメモリの場合はプログラム終了と共に消えるため簡易的に扱われることが多いです。
conn = sqlite3.connect(":memory:")
try:
cursor = conn.cursor()
# テーブルを作ってデータを入れてみる
cursor.execute("CREATE TABLE temp_logs (id INTEGER, message TEXT)")
cursor.execute("INSERT INTO temp_logs VALUES (1, 'Temporary Data')")
# データ確認
cursor.execute("SELECT * FROM temp_logs")
print(f"取得データ: {cursor.fetchone()}")
print("このデータはファイルには保存されません。")
finally:
conn.close()
print("オンメモリ接続を閉じました(データは破棄されました)。")
解説
接続オプション (connect)
database: ファイルパス。timeout: データベースがロックされている場合に待機する秒数(デフォルトは5.0秒)。isolation_level: トランザクション制御モード。Noneを指定すると自動コミットモードになります。
with 文の挙動について
sqlite3.connect() を with 文で使う場合、ファイル操作の open() と異なり、「接続の自動クローズ」は行われません。 代わりに 「トランザクション管理(成功時はコミット、例外時はロールバック)」 が自動で行われます。接続自体は、上記の例のように try...finally ブロックなどで明示的に close() するのが最も安全な実装パターンです。
