[Python] sqlite3の使い方(1)

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というテーブルを作成しています。このテーブルには、idnameagesalaryの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文のカッコ内に複数のカラム名をカンマで区切って指定します。この場合、nameageの複合インデックスが作成されます。このインデックスは、nameageのカラムを同時にソートしたテーブルを作成することで、検索の高速化を実現します。

インデックスの削除

インデックスは、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での開発には非常に便利です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次