TL;DR
SQLite は Python の標準ライブラリとして実装され、通常のファイルにデータベースを格納する。SQlite を使うための sqlite3 モジュールが提供されている。
sqlite3 モジュール のポイント
- connect()でコネクションを生成する
- cousor()でオブジェクトを返す
- execute()でテーブル作成、データ作成、情報表示を行う
- データベースが存在しない場合は自動で生成される
- すでにデータベースが存在する場合 CREATE を実行するとエラーになる
- 特殊文字列の
':memory:'
を指定するとメモリ内にデータベースを作る - with を合わせて使うのがよい
基本の形
変数を cur とした。最初に使用例を記載する。詳しい解説は後述する。
※ 次は省略した形で記述しているので、そのまま打ち込んでも反映されない。
import sqlite3
with sqlite3.connect('ファイル名.db') as conn:
# カーソルオブジェクトを返す
cur = conn.cursor()
# テーブルを作る
cur.execute()
# データを入れる
cur.execute()
# 情報を引き出す
cur.execute('SELECT * FROM person')
print(cur.fetchall())
# SQL命令文を実行後にデータベースへの変更を行う
conn.commit()
こちらが具体的に記述した内容。新しいデータベース test.db が作られる。すでにファイルが存在する場合はエラーになる。
import sqlite3
with sqlite3.connect('test.db') as conn:
cur = conn.cursor() # カーソルオブジェクトを返す
# テーブルを作る
cur.execute("""CREATE TABLE person
(id integer,
name text)
""")
# Insert実行
cur.execute("""INSERT INTO person
(id, name) VALUES (1, 'user1')
""")
# 情報を引き出す
cur.execute('SELECT * FROM person')
print(cur.fetchall())
# [(1, 'user1')]
# SQL命令文を実行後にデータベースへの変更を行う
conn.commit()
メソッドを簡単に解説しておこう。
メソッド | 処理 |
---|---|
cursor() | カーソルオブジェクトを返す |
execute() | テーブル作成、データ作成、情報表示 |
conn.commit() | SQL 命令文を実行後にデータベースへの変更を行う |
カーソルはクエリを実行し、その結果を調べる。
なぜ、commit()が必要なのか?
このメソッドは現在のトランザクションをコミットします。このメソッドを呼ばないと、前回 commit() を呼び出してから行ったすべての変更は、他のデータベースコネクションから見ることができません。もし、データベースに書き込んだはずのデータが見えなくて悩んでいる場合は、このメソッドの呼び出しを忘れていないかチェックしてください。
sqlite3 --- SQLite データベースに対する DB-API 2.0 インターフェース — Python 3.10.0b2 ドキュメント
SQL 基本コマンド
sqlite3 モジュールを扱うためには、SQL コマンドの知識が必要なので、少しばかり SQL の基本的なコマンドをおさらいをする。
SQL 文は、DDL と DML という 2 つのカテゴリに分類される。DDL はデータ定義言語、DML はデータ操作言語である。
DDL(データ定義言語)
DDL とは、表・データベース・ユーザー作成・削除・許可などの処理である。
操作 | パターン |
---|---|
データベース作成 | CREATE DATABASE データベース名 |
データベースの選択 | USE データベース名 |
データベースと表の削除 | DROP DATABASE データベース名 |
表の作成 | CREATE TABLE テーブル名 |
表の削除 | DROP TABLE テーブル名 |
表の全ての行削除 | TRUNCATE TABLE テーブル名 |
データベースやテーブル構成の変更 | ALTER |
DML(データ操作言語)
DML は、データ挿入・選択・更新・削除などの処理を行う。実際に使われる SQL 文のほとんどは DML である。
操作 | パターン |
---|---|
行追加(データ登録) | INSERT INTO テーブル名 |
すべての行と列の選択 | SELECT * FROM テーブル名 |
全ての行の特定列 | SELECT カラム名 FROM テーブル名 |
一部の行削除 | DELETE FROM テーブル名 WHERE コンディション |
テーブル行の更新 | UPDATE |
SQL がどういった働きをするのかご理解いただけたら、次に SQLite のコマンド操作方法を学ぶ。
SQLite
SQlite は、軽くて優れたオープンソースのデータベースである。MySQL や PostgreSQL などのリレーショナルデータベースと比較すると機能は限定的だがシンプルに扱える。ブラウザ・スマートフォンも組み込みデータベースとして SQLite を使っている。
sqlite の基本コマンドの使用例を示しておく。
CREATE(テーブルの作成)
sqlite> CREATE TABLE テーブル名 (カラム1 データ型, カラム2 データ型);
INSERT INTO(テーブルにデータを登録)
sqlite> INSERT INTO テーブル名 (カラム1, カラム2) VALUES (データ, データ);
SQLite のコマンド操作方法を理解したところで、いよいよ SQlite を使うための Python sqlite3 モジュールについて説明する。ここからが本論である。
sqlite3.connect
sqlite3 モジュールを扱うときは、コンテキストマネージャー(with 文の前後で処理を実行する)の with を合わせて使うのがよい。なぜなら、ファイルが確実に閉じられるからである。
with を使わない場合、.close()を記述しなくてはいけなくなる。
isolation_level
次のコードでは、commit()の代わりにisolation_level=None
を埋め込み、自動コミットモード にした。isolation_level は、現在のデフォルト分離レベルを取得設定する。
SQL の記述は長く分かりにくいので、視認性を高めるためにトリプルクォートの中に記述し改行させた。
import sqlite3
with sqlite3.connect('test.db', isolation_level=None) as conn:
# isolation_level=None は自動コミットモード
cur = conn.cursor() # カーソルオブジェクトを返す
# テーブルを作る
cur.execute("""CREATE TABLE person
(id integer,
name text)
""")
# Insert実行
cur.execute("""INSERT INTO person
(id, name) VALUES (1, 'user1')
""")
# 情報を引き出す
cur.execute('SELECT * FROM person')
print(cur.fetchall())
# [(1, 'user1')]
上述したコードの流れを次に示す。
- connect():データベースへ接続(開設)する
- cursor():クエリを管理するカーソルオブジェクトを作る
- execute():SQL を実行する
SQL の処理を簡単に解説する。
SQL の記述 | 処理内容 |
---|---|
CREATE | テーブルを作る |
INSERT | データを入れる |
SELECT | 情報を引き出す |
コードの最終行に記述した fetchall() メソッドは、一致した全ての行のリストとして受け取る働きをする。
※ すでにデータベースが存在する場合、CREATE を実行すると、エラーが返る。
作成したデータベースを、実際にコマンドで確認してみよう。まずは、OS のターミナルを立ち上げ、登録したデータが表示されるか確認する。
SQLite コマンドで確認
SQLite3 がインストールされているか確認
sqlite3 -version
3.28.0
SQLite3 を起動する
sqlite3 test.db
テーブルの一覧を見る
sqlite> .table
# person
スキーマを表示する
sqlite> .schema person
スキーマが表示された
CREATE TABLE person
(id integer,
name text);
テーブルの中
sqlite> SELECT * FROM person;
テーブルが表示された。
1|user1
sqlite3 --- SQLite データベースに対する DB-API 2.0 インターフェース — Python 3.10.0b2 ドキュメント