簡単なサンプルデータベースをGitHubで公開しています.まずここから db.sqlite をダウンロードして,Python のコードと同じフォルダに設置してください.
Windows のコマンドプロンプトや macOS のターミナルで SQLite を使って staffs.sqlite を利用する例を示します.staffs テーブルは「id」「name」「age」「department」という4つの列からなるテーブルで,7件のデータが保存されていることがわかります.
% sqlite3 db.sqlite ⏎ SQLite version 3.37.0 2021-12-09 01:34:53 Enter ".help" for usage hints. sqlite> .tables ⏎ staffs sqlite> .schema staffs ⏎ CREATE TABLE staffs ( id INT NOT NULL, name VARCHAR(32), age INT, department VARCHAR(32), PRIMARY KEY(id) ); sqlite> .headers ON ⏎ sqlite> SELECT * FROM staffs; ⏎ id|name|age|department 1|藤川|23|営業部 2|藤本|35|人事部 3|藤枝|32|製造部 4|藤原|48|営業部 5|藤森|44|人事部 6|藤平|28|製造部 7|藤谷|38|営業部 sqlite> .exit ⏎ %
SQLite データベースを利用するために,sqlite3 ライブラリをインポートします.
import sqlite3
次に,カレントフォルダ(Python コードと同じフォルダ)に設置された staffs.sqlite ファイルに接続して,カーソルを開きます.
conn = sqlite3.connect('db.sqlite')
curs = conn.cursor()
SQL文を発行して staffs テーブルから全てのレコードを検索します.なお SQL 文の最後に ;
を入れていますが,この ;
は省略可能です.
curs.execute("SELECT * FROM staffs;")
<sqlite3.Cursor at 0x7fd640b43f80>
検索結果を取り出して(フェッチして)表示します.
rows = curs.fetchall()
print(rows)
[(1, '藤川', 23, '営業部'), (2, '藤本', 35, '人事部'), (3, '藤枝', 32, '製造部'), (4, '藤原', 48, '営業部'), (5, '藤森', 44, '人事部'), (6, '藤平', 28, '製造部'), (7, '藤谷', 38, '営業部')]
次は年齢順で検索して表示します.
curs.execute("SELECT * FROM staffs ORDER BY age;")
rows = curs.fetchall()
print(rows)
[(1, '藤川', 23, '営業部'), (6, '藤平', 28, '製造部'), (3, '藤枝', 32, '製造部'), (2, '藤本', 35, '人事部'), (7, '藤谷', 38, '営業部'), (5, '藤森', 44, '人事部'), (4, '藤原', 48, '営業部')]
次は年齢の逆順に表示しますが,列の表示順も変更します.SQL文が長い時には,3重クォートを利用し,途中で改行すると良いでしょう.
curs.execute("""SELECT
id, name, department, age
FROM
staffs
ORDER BY age DESC;""")
rows = curs.fetchall()
print(rows)
[(4, '藤原', '営業部', 48), (5, '藤森', '人事部', 44), (7, '藤谷', '営業部', 38), (2, '藤本', '人事部', 35), (3, '藤枝', '製造部', 32), (6, '藤平', '製造部', 28), (1, '藤川', '営業部', 23)]
営業部に所属するスタッフの「id」と「name」だけを表示してみましょう.
curs.execute("SELECT id, name FROM staffs WHERE department = '営業部';")
rows = curs.fetchall()
print(rows)
[(1, '藤川'), (4, '藤原'), (7, '藤谷')]
もちろん for
構文を使って1件ずつ何らかの処理をすることも可能です.
for row in rows:
print(row)
(1, '藤川') (4, '藤原') (7, '藤谷')
なお,データベースの利用を終える時には,カーソルを閉じて,データベースから切断することも忘れないようにしよう.
curs.close()
conn.close()