この記事では、Python の sqlite3
モジュール を用いて SQLite3
を扱う際に、 SQLコマンド でテーブルを作成したりデータを取得したりする方法を解説します。
Python で SQLite3
を使う方法については以下の記事を参照してください。
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 テーブル名')
データベースから取得したデータはカーソルが保持しています。カーソルからデータを受け取るには以下の方法があります。
ジェネレータみたいに何度も値を取得できないので注意してください。
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))
実行結果
[]