0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者用】PythonのSQLite3ライブラリを使ってデータベースを作成するよ

Last updated at Posted at 2024-09-27

はじめに

本記事は、1ヶ月前まで「インデントってなに?」という状態だったプログラミング初心者が、Pythonで競馬アプリを作るためにSQLite3を学習したので、その復習も兼ねて解説する記事です。

ちゃんとしたチュートリアルを見たい方は、PythonのSQLite3公式ドキュメントをどうぞ。
なお、この記事ではSQL文の解説は省きます。私はSQLに関してはこの本で学習しました。

SQLite3ってなに?

SQLite(エスキューライト)とは、軽量な組み込み型のリレーショナルデータベース管理システム(RDBMS)のこと。
Pythonには標準ライブラリで組み込まれており、インストール不要で手軽に使えるのが特徴。
自分用のデスクトップアプリや、数十GB程度のデータベースならSQLiteで十分らしいのでSQLite3を選択。

データベースには他にも色々な種類があり、PythonではMySQLPostgreSQLといった外部ライブラリもあるので、自分の用途にあったDBを選びましょう。

簡単にSQLite3の利点と欠点を書いておくと、

SQLite3のメリット

  • 軽量でシンプル:単一のファイルでデータを管理できるため、デプロイも簡単。
  • サーバー不要:ローカル環境や組み込みシステムに最適。
  • ファイルベース:データベースファイルをコピーするだけで、他の環境でもそのまま使える。
  • 高速:小規模なデータセットや読み取り中心の操作には非常に高速で向いている。

SQLite3のデメリット

  • マルチスレッド対応が弱い:複数ユーザーが同時に書き込むアプリケーションには向かない。
  • 大規模データベースには不向き:MySQLやPostgreSQLが持つサーバー型データベース特有の機能がない。
  • セキュリティ機能が弱い:高度なアクセス制御やユーザーごとの認証機能がないため、セキュリティ対策はアプリケーション側で行う必要がある。

さっそくデータベースを作成してみよう

まずPythonでSQLite3を使う場合の基本的な流れを解説します。

  1. SQLite3ライブラリをインポート
  2. データベースファイルに接続
  3. カーソルを作成
  4. SQL文を作成
  5. カーソルを使ってSQL文を実行
  6. データベースとの接続を閉じる

と、こんな感じ。

プログラミング初心者は「カーソルってなんぞ?」となると思う。私はなったw
簡単に言うと、PythonでSQL文だけ打っても操作はできないから、まずSQLite3ライブラリを使ってデータベースと接続し、カーソルオブジェクトを使ってSQL文「デーブルを作れ」などの命令をデータベースに送る。
要はカーソルが、Pythonとデータベースを繋ぐ仲介役ってわけね。
(※厳密にはカーソルを明示的に作らなくてもにクエリを実行できるけど、説明は省く)

文章で説明しても分かりづらいし、実際に見た方が早いので、さっそくコードを書いていこう。

下記の名簿データを作成するよ。
※テーブル名は「persons」で作成。ちなみにエディタはVScodeを使用してます。

番号 名前 身長 体重
1 山田太郎 175 65.8
2 田中真紀 158 49.2
3 鈴木一郎 180 78.1

データベース作成コード

create_persons_data.py
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(コネクト)関数で、データベースに接続。
変数にはconconnが使われてることが多い。
ちなみに、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を使ってデータを取得し、それをターミナルに表示してみよう。
基本的な流れは、先に解説した通り。

select_persons_data.py
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 Notebookpandasを使えば、簡単に画像のように表示してくれる。
000.JPG

おわりに

PythonでSQLite3を扱う基本的な操作はこんな感じです。
基本的な流れを理解しちゃえば、簡単でしょ?
初心者は、プレースホルダトランザクションエラーハンドリングといった基礎的な概念も理解しておくと、より快適なデータベースライフを送れるかも?

とはいっても、私もまだSQL文の基礎を学んでる最中なんですけどね☆

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?