この記事では、Python の sqlite3モジュール を用いて SQLite3 を扱う際に、 SQLコマンド でテーブルを作成したりデータを取得したりする方法を解説します。
Python で SQLite3 を使う方法については以下の記事を参照してください。
SQLコマンドの実行
SQLite3 で SQLコマンドを実行するには、カーソルの execute()メソッド を使います。
Cursor.execute(sql[, parameters])
Connectionオブジェクト から execute()メソッド を呼び出すことも可能です。
Connection.execute(sql[, parameters])
この場合、内部でカーソルが生成され、与えられたパラメータを使ってカーソルの execute()メソッド を呼び出し、返り値にそのカーソルを返します。
それでは、実際にどのように SQLコマンド を書いていくか見ていきましょう。
テーブルの作成
テーブルを作成するには CREATE を実行します。
cur.execute('CREATE TABLE テーブル名 (カラム1 型, カラム2 型, ...)')
上記の方法では 2度目の実行時に同じ名前のテーブルを作成しようとして sqlite3.OperationalError が発生してしまいます。
そんな時は、以下のように CREATE TABLE に IF NOT EXISTS を付けることでテーブルが存在していれば無視、存在していなければ作成してくれるようになります。
cur.execute('CREATE TABLE IF NOT EXISTS テーブル名 (...)')
Python の型は以下のように変換されます。
| Pythonの型 | SQLiteの型 |
|---|---|
| None | NULL |
| int | INTEGER |
| float | REAL |
| str | TEXT |
| bytes | BLOB |
database.db という名前のデータベースに ID、名前、年齢 というカラムを持つ personテーブル を作成するには以下のようにします。
import sqlite3 # データベース接続 con = sqlite3.connect('database.db') # カーソルの生成 cur = con.cursor() # テーブルの作成 cur.execute('CREATE TABLE IF NOT EXISTS person (id int, name str, age int)') # 接続を閉じる con.close()
データの挿入
テーブルにデータを挿入するには INSERT を実行します。
cur.execute('INSERT INTO テーブル名 VALUES(カラム1の値, カラム2の値, ...)')
personテーブル に適当なデータを挿入してみます。
cur.execute('INSERT INTO person VALUES(1, "田中", 20)') # コミットしないと変更が適用されない con.commit()
以下のようにフォーマットしながら指定することも可能です。Python の文字列操作では安全ではないので注意してください。
id_n = 2 name = 'マイケル' age = 14 cur.execute(f'INSERT INTO person VALUES(?, ?, ?)', (id_n, name, age)) # コミットしないと変更が適用されない con.commit()
また、executemany() を使うことでシーケンスで複数のデータを挿入可能です。
person_data = [ (3, "今井", 32), (4, "山本", 18), ] cur.executemany(f'INSERT INTO person VALUES(?, ?, ?)', person_data) con.commit()
データの取得
テーブルのデータを取得するには SELECT を実行します。
cur.execute('SELECT カラム名 FROM テーブル名')
データベースから取得したデータはカーソルが保持しています。カーソルからデータを受け取るには以下の方法があります。
- カーソル自体から取得
- fetchall() でリストとして取得
- fetchone() で1つずつ取得
ジェネレータみたいに何度も値を取得できないので注意してください。
personテーブル の nameカラム のデータを取得するには以下のように実行します。
cur.execute('SELECT name FROM person')
カーソルから取得。カーソル自体をジェネレータみたいに扱える。
print(list(cur))
実行結果
[('田中',), ('マイケル',), ('今井',), ('山本',)]
fetchall() でリストとして取得。
print(cur.fetchall())
実行結果
[('田中',), ('マイケル',), ('今井',), ('山本',)]
fetchone() で1つずつ取得。
print(cur.fetchone()) print(cur.fetchone()) print(cur.fetchone()) print(cur.fetchone()) print(cur.fetchone())
実行結果
('田中',) ('マイケル',) ('今井',) ('山本',) None
すべてのカラムのデータの取得
カラム名に *(アスタリスク) を指定することですべてのカラムのデータを取得可能。
cur.execute('SELECT * FROM テーブル名')
personテーブル のデータをすべて取得してみます。
cur.execute('SELECT * FROM person') for row in cur: print(row)
実行結果
(1, '田中', 20) (2, 'マイケル', 14) (3, '今井', 32) (4, '山本', 18)
条件を指定する
条件を指定するには WHERE を使って条件式を記述します。
cur.execute('SELECT カラム名 FROM テーブル名 WHERE 条件式')
以下では ID が偶数のレコードのみ取得しています。
cur.execute('SELECT * FROM person WHERE id % 2 == 0') for row in cur: print(row)
実行結果
(2, 'マイケル', 14) (4, '山本', 18)
データの更新
テーブルのデータを更新するには UPDATE を実行します。
cur.execute('UPDATE テーブル名 SET カラム名 = カラム値')
以下のコードでは personテーブル の ageカラム を 0 に変更しています。
cur.execute('UPDATE person SET age = 0') # 変更の適用 con.commit() cur.execute('SELECT * FROM person') print(list(cur))
実行結果
[(1, '田中', 0), (2, 'マイケル', 0), (3, '今井', 0), (4, '山本', 0)]
特定のレコードのみ変更したい場合は WHERE で条件を指定します。以下では name が「今井」の場合のみ age を 100 に変更しています。
cur.execute('UPDATE person SET age = 100 WHERE name="今井"') con.commit() cur.execute('SELECT * FROM person') print(list(cur))
実行結果
[(1, '田中', 0), (2, 'マイケル', 0), (3, '今井', 100), (4, '山本', 0)]
データの削除
データを削除するには DELETE を実行します。以下のコマンドを実行すると指定されたテーブルのすべてのレコードが削除されます。
cur.execute('DELETE FROM テーブル名')
特定のレコードのみ削除したい場合は WHERE で条件を指定します。
cur.execute('DELETE FROM テーブル名 WHERE 条件式')
personテーブル の ID が 2よりも大きいレコードを削除してみます。
cur.execute('DELETE FROM person WHERE id > 2') con.commit() cur.execute('SELECT * FROM person') print(list(cur))
実行結果
[(1, '田中', 0), (2, 'マイケル', 0)]
次に personテーブル のすべてのレコードを削除します。
cur.execute('DELETE FROM person') con.commit() cur.execute('SELECT * FROM person') print(list(cur))
実行結果
[]


