はじめに
本記事は、1ヶ月前まで「インデントってなに?」という状態だったプログラミング初心者が、Pythonで競馬アプリを作るためにSQLite3を学習したので、その復習も兼ねて解説する記事です。
ちゃんとしたチュートリアルを見たい方は、PythonのSQLite3公式ドキュメントをどうぞ。
なお、この記事ではSQL文の解説は省きます。私はSQLに関してはこの本で学習しました。
SQLite3ってなに?
SQLite(エスキューライト)とは、軽量な組み込み型のリレーショナルデータベース管理システム(RDBMS)のこと。
Pythonには標準ライブラリで組み込まれており、インストール不要で手軽に使えるのが特徴。
自分用のデスクトップアプリや、数十GB程度のデータベースならSQLiteで十分らしいのでSQLite3を選択。
データベースには他にも色々な種類があり、PythonではMySQL
やPostgreSQL
といった外部ライブラリもあるので、自分の用途にあったDBを選びましょう。
簡単にSQLite3の利点と欠点を書いておくと、
SQLite3のメリット
- 軽量でシンプル:単一のファイルでデータを管理できるため、デプロイも簡単。
- サーバー不要:ローカル環境や組み込みシステムに最適。
- ファイルベース:データベースファイルをコピーするだけで、他の環境でもそのまま使える。
- 高速:小規模なデータセットや読み取り中心の操作には非常に高速で向いている。
SQLite3のデメリット
- マルチスレッド対応が弱い:複数ユーザーが同時に書き込むアプリケーションには向かない。
- 大規模データベースには不向き:MySQLやPostgreSQLが持つサーバー型データベース特有の機能がない。
- セキュリティ機能が弱い:高度なアクセス制御やユーザーごとの認証機能がないため、セキュリティ対策はアプリケーション側で行う必要がある。
さっそくデータベースを作成してみよう
まずPythonでSQLite3を使う場合の基本的な流れを解説します。
- SQLite3ライブラリをインポート
- データベースファイルに接続
- カーソルを作成
- SQL文を作成
- カーソルを使ってSQL文を実行
- データベースとの接続を閉じる
と、こんな感じ。
プログラミング初心者は「カーソルってなんぞ?」となると思う。私はなったw
簡単に言うと、PythonでSQL文だけ打っても操作はできないから、まずSQLite3ライブラリを使ってデータベースと接続し、カーソルオブジェクトを使ってSQL文「デーブルを作れ」などの命令をデータベースに送る。
要はカーソルが、Pythonとデータベースを繋ぐ仲介役ってわけね。
(※厳密にはカーソルを明示的に作らなくてもにクエリを実行できるけど、説明は省く)
文章で説明しても分かりづらいし、実際に見た方が早いので、さっそくコードを書いていこう。
下記の名簿データを作成するよ。
※テーブル名は「persons」で作成。ちなみにエディタはVScodeを使用してます。
番号 | 名前 | 身長 | 体重 |
---|---|---|---|
1 | 山田太郎 | 175 | 65.8 |
2 | 田中真紀 | 158 | 49.2 |
3 | 鈴木一郎 | 180 | 78.1 |
データベース作成コード
import sqlite3
# データベースに接続(この時点でファイルがなければ自動的に作成される)
conn = sqlite3.connect("persons_data.db")
# カーソルオブジェクトを作成
cur = conn.cursor()
# テーブルを作成するためのSQL文を変数に代入
create_table_query = """
CREATE TABLE IF NOT EXISTS persons (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
height INTEGER NOT NULL,
weight REAL NOT NULL
);
"""
# カーソルオブジェクトのメソッドを使って、テーブル作成のSQL文を実行
cur.execute(create_table_query)
# データを追加するためのSQL文を変数に代入
insert_query = """
INSERT INTO persons (id, name, height, weight)
VALUES (?, ?, ?, ?)
"""
# 追加するデータ
data = [
(1, "山田太郎", 175, 65.8),
(2, "田中真紀", 158, 49.2),
(3, "鈴木一郎", 180, 78.1),
]
# カーソルオブジェクトのメソッドを使って、データを一括で挿入
cur.executemany(insert_query, data)
# 変更を保存
conn.commit()
# カーソルと接続を閉じる
cur.close()
conn.close()
コードを実行すると、フォルダ内にpersons_data.db
が作成されて、下記画像のようにテーブルが作成される。
※VScodeにSQLite Viewerという拡張を入れるとdbファイルを直接開いて、中身を確認出来る。
ポイント解説
SQLite3ライブラリをインポート
Pythonでライブラリを使う場合は、これがないと始まらない。
import sqlite3
データベースへの接続(connect関数)
connect(コネクト)関数で、データベースに接続。
変数にはcon
やconn
が使われてることが多い。
ちなみに、connect
関数は指定したデータベースに接続するための関数だけど、データベースが存在しない場合は、自動的にファイルを作成してくれるため、SQL文のCREATE DATABASE
文の役割も果たしてくれる。
SQLite3のファイル拡張子は、「.sqlite」「.sqlite3」「.db」「.db3」どれを使っても良いみたいだけど、参考書では.db
が使われていたのでdbにした。
接続変数 = sqlite3.connect("データベースファイル名.db")
カーソルを作成(cursorメソッド)
cursor(カーソル)メソッドを使ってカーソルオブジェクトを作成。
先にも説明したように、カーソルはデータベースとのやり取りを行うためのインターフェースで、SQL文をデータベースに送信したり、結果を取得する役割を持っている。
変数にはcur
が使われてることが多い。
カーソル変数 = 接続変数.cursor()
SQL文を実行(executeメソッド)
カーソルのexecute(エグゼキュート)メソッドで、SQL文をデータベースに送って実行することができる。SQL文は文字列で指定する。
カーソル変数.execute("SQL文")
SQL文をまとめて実行(executemanyメソッド)
executemany(エグゼキュートメニー)は、execute(実行する)とmany(たくさん)を組み合わせたメソッドで、複数のSQL文を一度に実行することができる。特にINSERT INTO
文などで複数データを一括で追加したいときは、execute()
よりexecutemany()
を使った方がコードがスッキリして効率的になる。
カーソル変数.executemany("SQL文")
データベース変更の確定(commitメソッド)
SQL文でINSERT(挿入)、UPDATE(更新)、DELETE(削除)といった操作を行ったとき、それだけでは実際に変更は反映されていないので、変更を確定させるためにcommit(コミット)メソッドを実行する必要がある。
接続変数.commit()
データベースへの接続を閉じる(closeメソッド)
データベースの操作が終わったら、最後にclose(クローズ)メソッドで接続を閉じる。
接続を閉じないと、データベースとの通信が無駄に続き、システムリソースを消費することになる。
カーソル変数.close()
接続変数.close()
作成したデータベースを表示してみよう
次は、作成したデータベースからSQL文のSELECT
を使ってデータを取得し、それをターミナルに表示してみよう。
基本的な流れは、先に解説した通り。
import sqlite3
# データベースに接続
conn = sqlite3.connect("persons_data.db")
# カーソルオブジェクトを作成
cur = conn.cursor()
# SELECT文でデータを取得
cur.execute("SELECT * FROM persons")
# カラム名を取得してprintで表示
headers = [description[0] for description in cur.description]
print(headers)
# データを取得してprintで表示
for row in cur.fetchall():
print(row)
# カーソルと接続を閉じる
cur.close()
conn.close()
コードを実行すると、ターミナルにデータが表示される。
表示を綺麗にしたいならJupyter Notebook
とpandas
を使えば、簡単に画像のように表示してくれる。
おわりに
PythonでSQLite3を扱う基本的な操作はこんな感じです。
基本的な流れを理解しちゃえば、簡単でしょ?
初心者は、プレースホルダ
やトランザクション
、エラーハンドリング
といった基礎的な概念も理解しておくと、より快適なデータベースライフを送れるかも?
とはいっても、私もまだSQL文の基礎を学んでる最中なんですけどね☆