Categories: Python

【Python】SQLite3 – SQLコマンドの使い方

この記事では、Python の sqlite3モジュール を用いて SQLite3 を扱う際に、 SQLコマンド でテーブルを作成したりデータを取得したりする方法を解説します。

Python で SQLite3 を使う方法については以下の記事を参照してください。

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 TABLEIF 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 が「今井」の場合のみ age100 に変更しています。

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))

実行結果

[]
ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago