20  Python SQLite3モジュール

SQLiteは,軽量なデータベースエンジンであり,Pythonの標準ライブラリに含まれている.Pythonでは,sqlite3モジュールを使用してSQLiteデータベースを操作できる.

Pythonを使用する経験がない場合は,以下の手順でColabを使用してSQLiteデータベースを操作できる.

  1. Googleアカウントにログインする.
  2. Google Colabにアクセスする.
  3. 「+ New notebook」をクリックして新しいノートブックを作成する.
  4. ソースコードをセルにコピー&ペーストする.
  5. 実行ボタンまたはShift + Enterキーを押してセルを実行する.
  6. 必要に応じて,「+ Code」をクリックして新しいセルを追加できる.

20.1 Cursor

20.1.1 データベースの作成

import sqlite3を使用してSQLiteモジュールをインポートする.

sqlite3.connect() を呼び出して,SQLiteデータベースを作成する.以下のコードは,example.dbというデータベースに接続する.

import sqlite3
con = sqlite3.connect('example.db')

データベースが存在しない場合は,新しく作成される.ブラウザの左側のファイルアイコンをクリックすると,example.dbが作成されていることが確認できる.

20.1.2 cursorの作成

SQL文の実行や,結果を取得するために,con.cursor()が必要である.

cur = con.cursor()

20.1.3 テーブルの作成

execute()メソッドを使用して,SQL文を実行する.

以下の例では,studentsというテーブルを作成する.

cur.execute('''
CREATE TABLE students (
    id TEXT PRIMARY KEY,
    name TEXT NOT NULL,
    age INTEGER NOT NULL
)''')

作成したテーブルを確認するために,sqlite_masterテーブルをクエリする.

res = cur.execute("SELECT name FROM sqlite_master")
res.fetchone()

('students',)のような結果が返されれば,テーブルが正しく作成されている.

20.1.4 データの追加

execute()メソッドを使用して,データをテーブルに追加する.

以下の例では,studentsテーブルに3人の学生のデータを挿入する.

cur.execute('''
INSERT INTO students (id, name, age) VALUES
('s001', 'Alice', 20),
('s002', 'Bob', 22),
('s003', 'Charlie', 21)
''')

con.commit()を呼び出して,変更をデータベースに保存する.

con.commit()
res = cur.execute("SELECT * FROM students")
res.fetchall()

[('s001', 'Alice', 20), ('s002', 'Bob', 22), ('s003', 'Charlie', 21)]のような結果が返されれば,データが正しく追加されている.

この結果は,Pythonのlistであり,一つのlistに複数のtupleが含まれている.各tupleは,テーブルの各行を表している.

20.1.5 listからのデータの追加

以下の例では,pythonのlistからデータを追加する.

data = [
    ('s004', 'David', 23),
    ('s005', 'Eve', 19)
]
cur.executemany('''
INSERT INTO students (id, name, age) VALUES (?, ?, ?)''', data)
con.commit()

?はplaceholderで,executemany()メソッドはdataリストの各要素を順番に置き換える.

res = cur.execute("SELECT * FROM students")
res.fetchall()

cur.execute()の結果をiterateすることで,各行を個別に処理することもできる.

for row in cur.execute("SELECT name, age FROM students ORDER BY age"):
    print(row)

20.1.6 close()メソッド

データベースの操作が完了したら,close()メソッドを使用して,cursorとデータベース接続を閉じる.

cur.close()
con.close()

20.1.7 データベースに接続する

作成したデータベースに再度接続するには,同じようにsqlite3.connect()を使用する.

new_con = sqlite3.connect('example.db')
new_cur = new_con.cursor()

res = new_cur.execute("SELECT * FROM students ORDER BY age DESC")
student_id, name, age = res.fetchone()
print(f'The oldest student is {name} with age {age}.')

new_cur.close()
new_con.close()

20.2 pandas

import pandas as pd
import sqlite3

# sample data
df = pd.DataFrame({
    'id': ['s001', 's002', 's003'],
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [20, 22, 21]
})

# write to SQLite database
con = sqlite3.connect('pd_example.db')
df.to_sql('students', con, if_exists='replace', index=False)

# read from SQLite database
df_read = pd.read_sql_query('SELECT * FROM students', con)
print(df_read)

# another query
df_read = pd.read_sql_query('SELECT name, age FROM students WHERE age > 20', con)
print(df_read)

# close connection
con.close()

20.2.1 pandas.DataFrame.to_sql()

  • https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_sql.html

DataFrameをSQLiteデータベースに書き込む.

pandas.DataFrame.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None, method=None)

"""
parameters
---
name : str
    書き込むテーブルの名前.
con : sqlite3.Connection
    SQLiteデータベースへの接続オブジェクト.
"""

20.2.2 pandas.read_sql_query()

  • https://pandas.pydata.org/docs/reference/api/pandas.read_sql_query.html

SQLクエリの結果をDataFrameに読み込む.

pandas.read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None)

"""
parameters
---
sql : str
    SQLクエリ文.
con : str or sqlite3 connection
    SQLiteデータベースへの接続オブジェクト.
"""

20.3 参考資料