1 インポート
Pythonは標準ライブラリにsqlite3が含まれているので、importするだけで使うことができる。
import sqlite3
2 データベースに接続、カーソルを取得
データベースファイルの名前を指定して接続し、接続からカーソルを取得する。
ファイルが存在しない場合は新規作成されるので、既存のファイルに接続する場合は、別途ファイルの存在チェックをしたほうが良いかもしれない。
con = sqlite3.connect("sample.db")
cur = con.cursor()
特殊な使い方として、データベース名に":memory:"を指定すると、メモリ上にデータベースを作成できる。
con = sqlite3.connect(":memory:")
3 SQLを実行
3.1 基本的な実行方法
カーソルのメソッドexecute()
に、文字列でSQLを渡すことでSQLを実行できる。
cur.execute("CREATE TABLE people ( id INTEGER PRIMARY KEY, name TEXT, score INTEGER)")
接続したファイルが正常なsqliteファイルでなかった場合、接続する段階ではエラーが出ず、SQLを実行するタイミングでエラーが投げられる仕様になっているようなので、エラーハンドリングする際には注意すること。
3.2 変数を使用したいとき
SQL内で変数を使いたい場合、変数を挿入する箇所を?にする。引数にタプルを渡すと、タプルの要素をSQLに挿入してから実行してくれる。
name_sample = "Bob"
score_sample = 80
cur.execute("INSERT INTO people (name,score) VALUES (?,?)",(name_sample, score_sample))
文字列のエスケープなども適切に行ってくれるので、変数を使いたいときは、単純に文字列連結するのではなくこの方法を使ったほうがよい。
3.3 複数のデータに対してまとめてSQLを実行したいとき
executemany()
を使用することで、複数のデータに対して同じ処理を一括で行うことができる。
datalist = [ ("Katou",60) , ("Suzuki",75) , ("Yamada",80) ]
cur.executemany("INSERT INTO people (name,score) VALUES (?,?)" , datalist)
3.4 SELECT文の結果を取得したいとき
execute()
の戻り値を受け取り、fetchall()
を実行することでSELECT文の実行結果を取得できる。
行列はタプルのリストとして表現される。
response = cur.execute("SELECT * FROM people")
matrix = response.fetchall()
print(matrix)
[(1, 'Bob', 80), (2, 'Katou', 60), (3, 'Suzuki', 75), (4, 'Yamada', 80)]
fetchall()
の代わりにfetchone()
を使うと、データをタプルとして一行ごとに取得できる。
response = cur.execute("SELECT * FROM people")
line1 = response.fetchone()
line2 = response.fetchone()
print(line1)
print(line2)
(1, 'Bob', 80)
(2, 'Katou', 60)
4 コミット、終了
pythonのsqlite3モジュールの場合、デフォルトではコミットするまで操作が反映されない。
更新した場合は終了前にコミットが必要になる。
con.commit()
con.close()
コードの途中でコミットしていない更新を破棄したい場合、rollback()
を実行する。
con.rollback()
参考リンク