SQLite3は、Python標準ライブラリに含まれている軽量のデータベースエンジンであり、ファイルベースで動作するため、インストールなどの手間が必要ありません。また、Pythonとの親和性が高く、シンプルで使いやすいため、Pythonの初心者でも簡単に使えます。
このページではsqlite3モジュール利用準備〜テーブル作成・データ取得(SELECT)の説明をします。
SQLite3をPythonで使用するための準備
まず、SQLite3をPythonで使用するためには、Python標準ライブラリのsqlite3
モジュールをインポートする必要があります。次に、データベースを作成するためのファイルを作成し、ファイル名とパスを指定します。
import sqlite3
# データベースを作成するファイル名とパスを指定
db_file = "sample.db"
# データベースに接続
conn = sqlite3.connect(db_file)
ここで、sqlite3.connect()
メソッドを使用して、指定したファイル名とパスにデータベースを作成します。このメソッドを呼び出すことで、SQLite3のデータベースに接続できます。connect()
メソッドは、データベースファイルが存在しない場合は新しいデータベースファイルを作成します。
テーブルを作成する
次に、データベースにテーブルを作成する必要があります。テーブルは、データを保存するための表のようなものであり、カラムと行で構成されています。カラムは、テーブルに保存されるデータの種類を定義し、行は、実際に保存されるデータです。
以下の例では、employees
というテーブルを作成しています。このテーブルには、id
、name
、age
、salary
の4つのカラムがあります。
# カーソルオブジェクトを作成
cur = conn.cursor()
# テーブルを作成
cur.execute('''CREATE TABLE IF NOT EXISTS employees (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER,
salary REAL);''')
# 変更をコミット
conn.commit()
# 接続をクローズ
conn.close()
まず、conn.cursor()
メソッドを使用して、カーソルオブジェクトを作成します。カーソルオブジェクトは、SQL文を実行するためのオブジェクトです。次に、execute()
メソッドを使用して、CREATE TABLE
文を実行してテーブルを作成します。CREATE TABLE
文の中で、カラム名とデータ型を指定し、必要に応じて制約を設定することができます。例えば、PRIMARY KEY
制約を使用して、一意の識別子を定義することができます。
最後に、変更をコミットして接続をクローズする必要があります。commit()
メソッドは、変更を確定し、close()
メソッドは、データベース接続をクローズします。
(オプション)インデックスの作成・削除・確認
高速な検索を実現するために、インデックスを設定することができます。インデックスは、データベース内のテーブルの特定のカラムに対して、ソートされた検索用のテーブルを作成することで、検索の高速化を実現します。また、複合インデックスを使用することで、複数のカラムに対するインデックスを設定することができます。
インデックスの作成
インデックスは、CREATE INDEX文を使用して設定します。
単一インデックス
例えば、以下のようなコードを使用して、users
テーブルのname
カラムに対する単一インデックスを設定できます。
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('CREATE INDEX idx_users_name ON users (name)')
conn.commit()
conn.close()
このコードでは、CREATE INDEX
文でインデックスを作成しています。idx_users_name
はインデックス名であり、users
は対象のテーブル名、name
はインデックスを作成するカラム名です。このインデックスは、name
カラムをソートしたテーブルを作成することで、検索の高速化を実現します。
複合インデックス
複合インデックスは、2つ以上のカラムに対するインデックスを設定することができます。複合インデックスは、複数のカラムを同時に検索する場合に非常に効果的です。
以下は、users
テーブルのname
カラムとage
カラムに対する複合インデックスを設定する方法の例です。
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('CREATE INDEX idx_users_name_age ON users (name, age)')
conn.commit()
conn.close()
このコードでは、CREATE INDEX
文のカッコ内に複数のカラム名をカンマで区切って指定します。この場合、name
とage
の複合インデックスが作成されます。このインデックスは、name
とage
のカラムを同時にソートしたテーブルを作成することで、検索の高速化を実現します。
インデックスの削除
インデックスは、DROP INDEX文を使用して削除することができます。以下は、users
テーブルのname
カラムに対するインデックスを削除する方法の例です。
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('DROP INDEX idx_users_name')
conn.commit()
conn.close()
このコードでは、DROP INDEX
文を使用してidx_users_name
というインデックスを削除しています。
インデックスの確認
インデックスを確認するには、以下のようにPRAGMA文を使用します。
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('PRAGMA index_list(users)')
rows = c.fetchall()
for row in rows:
print(row)
conn.close()
このコードでは、PRAGMA index_list
文を使用して、users
テーブルに設定されたインデックスのリストを取得しています。取得したインデックスのリストは、fetchall
メソッドで取得し、for
ループで表示しています。
データを取得する(SELECT)
データが登録済み(1件以上登録している)か確認する
テーブルにデータが登録済みかどうかはSELECT
文を使用して、1件以上ヒットするかどうかで判定します。
# テーブルにデータが存在するかどうかを管理するフラグ
existFlg = False
# データベースに接続
conn = sqlite3.connect(db_file)
# カーソルオブジェクトを作成
cur = conn.cursor()
# データを取得
cur.execute("SELECT count(*) FROM employees")
# 取得したデータを表示
result = cursor.fetchone()
if result[0] > 0:
# データが1件以上存在していたらTrue
existFlg = True
else:
# データが0件の場合はFalse
existFlg = False
# 接続をクローズ
conn.close()
データを取得する
作成したテーブルからデータを取得する方法を見ていきましょう。
# データベースに接続
conn = sqlite3.connect(db_file)
# カーソルオブジェクトを作成
cur = conn.cursor()
# データを取得
cur.execute("SELECT * FROM employees")
# 取得したデータを表示
for row in cur.fetchall():
print(row)
# 接続をクローズ
conn.close()
データを取得するには、SELECT
文を使用します。ここでは、employees
テーブルからすべての行を取得しています。fetchall()
メソッドを使用して、取得したデータをリストで取得し、ループを使用して、1行ずつ表示しています。
レコードの追加(INSERT)・更新(UPDATE)・削除(DELETE)、テーブルの削除(DROP)についてはこちらのページで説明していますので、よかったら見てみてください。
まとめ
以上が、PythonでSQLite3を使用する基本的な方法です。SQLite3は、簡単に使えるデータベースエンジンであり、Pythonとの親和性が高いため、Pythonでの開発には非常に便利です。