導入
データベース管理の現場において、大規模なRDBMS(OracleやPostgreSQLなど)を導入するほどではない場合や、アプリケーションのプロトタイプ開発、あるいはテスト環境の構築において、SQLiteは非常に強力な選択肢です。SQLiteは「サーバーレス」であり、設定不要でファイル一つで完結するため、開発効率を劇的に向上させます。「なぜ重厚なDBが必要なのか?」という問いに対し、SQLiteという軽量な選択肢を知っておくことは、DBAとして持っておくべき重要な引き出しの一つです。
基礎知識
SQLiteは、標準的なSQLエンジンを内蔵したC言語のライブラリです。最大の特徴は、データベース全体が「単一のファイル」としてディスク上に保存される点にあります。他のRDBMSのようにサーバープロセスを立ち上げる必要がなく、アプリケーションが直接ファイルを読み書きします。
SQLiteを利用する際は、コマンドラインツール(sqlite3)を使用するのが最も基本です。SQL文の末尾には必ずセミコロン(;)が必要であり、SQLite独自のコマンド(ドットで始まるコマンド)とSQL文を使い分ける必要があります。
実装/解決策
実務でSQLiteを扱う際は、以下の3点を押さえておくとスムーズです。
1. データの永続化: メモリ内(:memory:)で動作させることも可能ですが、通常はファイル名(例: app.db)を指定して接続します。
2. データ型: SQLiteは「動的型付け」を採用しており、列に定義した型と異なる値を挿入してもエラーになりにくい性質があります。ただし、データ整合性の観点から設計時には厳格な型定義を推奨します。
3. トランザクション: ファイルベースであるため、書き込み時はファイル全体がロックされます。高頻度の同時書き込みには向かないため、アプリケーション側での接続管理が重要です。
サンプルプログラム
以下は、Pythonを使用してSQLiteに接続し、テーブル作成からデータ挿入までを行う実践的なコード例です。
import sqlite3
1. データベースに接続(ファイルが存在しない場合は作成される)
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
2. テーブル作成(IF NOT EXISTSを使用することで再実行時のエラーを防ぐ)
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
)
''')
3. データの挿入(プレースホルダーを使用しSQLインジェクションを防止)
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('佐藤太郎', 28))
4. 変更を確定(コミット)
conn.commit()
5. 接続を閉じる
conn.close()
print("データベース操作が正常に完了しました。")
応用・注意点
現場での運用において特に注意すべきは「同時実行性」です。SQLiteはデフォルトでは書き込み時にデータベース全体をロックします。複数のプロセスから頻繁に書き込みが発生する場合、エラー(SQLITE_BUSY)が発生しやすくなります。これを回避するために、WAL(Write-Ahead Logging)モードを有効にすることをお勧めします。
SQL実行時に「PRAGMA journal_mode=WAL;」を実行するだけで、読み取りと書き込みの競合を大幅に減らすことが可能です。また、バックアップはファイルそのものをコピーするだけで完結しますが、オンラインバックアップを行う場合はSQLiteが提供するBackup APIを利用するようにしてください。これらの特性を理解し、要件に合わせて適切に使い分けることが、優秀なDBAの第一歩です。

コメント