Pythonからデータベースを操作するsqlite3の使い方を解説
プログラミングを学んでいると、必ずと言っていいほどデータの保存という壁にぶつかります。
変数を保存するだけでは、プログラムを終了した瞬間にデータが消えてしまいますし、テキストファイルに保存するのは管理が大変ですよね。
そこで登場するのがデータベースです。 中でもPythonに標準で付属しているSQLiteは、初心者にとって最高の学習ツールであり、実務でも強力な味方になります。
私も、プロトタイプの作成や小規模なツールの開発では、今でも真っ先にSQLiteを選択します。 今回は、Pythonを使ってこの便利なデータベースを自由自在に操る方法を、基礎から応用までじっくり解説していきます。
そもそもSQLiteとは何者なのか?¶
データベースと聞くと、難しいサーバーの設定や複雑なネットワークの知識が必要だと思われがちです。 しかし、SQLiteはとてもシンプルに作られています。
まずは、なぜPython学習者が最初にSQLiteを学ぶべきなのか、その理由を整理してみましょう。 他のデータベースと比較した際の特徴を知ることで、使い所が明確になります。
サーバー不要でファイル1つで完結する¶
一般的なデータベース(MySQLやPostgreSQLなど)は、専用のサーバーソフトをインストールして起動しておく必要があります。 これに対してSQLiteは、ただの1つのファイルとしてデータが保存されます。
# データベースファイルがカレントディレクトリに作成されるイメージ
my_database.db
つまり、ファイルをコピーするだけでデータの持ち運びが可能です。 特別な準備が一切いらないこの手軽さが、Pythonと非常に相性が良い理由の一つですね。
Pythonに標準搭載されている安心感¶
SQLiteを操作するためのsqlite3モジュールは、Pythonをインストールした時点で既に中に入っています。
新しくライブラリをインストール(pip installなど)する必要はありません。
import sqlite3
これだけで準備完了です。 環境構築でつまづくことが多い初心者にとって、インポートするだけで使い始められるのは大きなメリットと言えるでしょう。
データベース操作の基本サイクルを理解する¶
データベースを操作する手順は、実は決まったパターンがあります。 この流れを一度覚えてしまえば、どんなに複雑なプログラムでも迷うことはありません。
エンジニアの世界では、この一連の動作をお作法のように扱います。 まずは全体の流れを俯瞰してみましょう。
5つのステップで覚える操作手順¶
PythonからSQLiteを使うときは、以下の5つのステップを意識してください。 この順序を守ることで、データの破損やメモリの無駄遣いを防ぐことができます。
- データベースに接続する(Connectionの作成)
- 操作するための窓口を作る(Cursorの作成)
- SQL文を実行してデータを操作する(Execute)
- 変更を確定させる(Commit)
- 接続を閉じる(Close)
この中でも特に重要なのが、2番目のカーソル(Cursor)という概念です。 これは、データベースという図書館の中で、実際に本棚から本を取り出したり書き込んだりしてくれる司書さんのような存在だと考えてください。
基本的な接続コードの例¶
実際にプログラムを書いてみましょう。 まずはデータベースファイルを作成し、接続を確認するだけのシンプルなコードです。
import sqlite3
# 1. 接続する(ファイルがなければ自動作成される)
conn = sqlite3.connect('example.db')
# 2. カーソルを作る
cur = conn.cursor()
# ここで色々な操作を行う
# 5. 閉じる
conn.close()
このように、最初と最後をしっかり挟むのが基本です。 もし途中でエラーが起きて接続が開きっぱなしになると、他のプログラムからファイルがいじれなくなることもあるので注意しましょう。
テーブルを作成してデータを格納する準備¶
データベースの中に、データを整理するための表を作りましょう。 この表のことをテーブルと呼びます。
テーブルを作る際には、どのような項目(カラム)を、どのような形式(データ型)で保存するかを決める必要があります。 Excelの1行目にタイトルを付ける作業に似ていますね。
SQL文を使ってテーブルを定義する¶
データベースへの命令は、SQL(Structured Query Language)という専用の言葉を使います。 Pythonのコードの中に、このSQL文を文字列として書き込んで実行させます。
# テーブルを作成するSQL
create_table_sql = """
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE
);
"""
cur.execute(create_table_sql)
conn.commit()
ここで使ったIF NOT EXISTSという言葉は、既にテーブルがある場合にエラーを出さないためのおまじないです。
エンジニア歴10年の経験から言わせてもらうと、この一言を添えるだけでプログラムの安定感がぐっと増します。
SQLiteで使える主なデータ型¶
SQLiteは他のデータベースに比べて扱えるデータの種類が絞られています。 しかし、日常的な用途であればこれで十分すぎるほどです。
| データ型 | 内容 |
|---|---|
| NULL | 空の値 |
| INTEGER | 整数(1, 2, 100など) |
| REAL | 浮動小数点数(3.14など) |
| TEXT | 文字列 |
| BLOB | 画像や音声などのバイナリデータ |
基本的にはTEXTとINTEGERの2つを使いこなせれば、大抵のアプリは作れてしまいます。 日付データなどはTEXTとして保存し、Python側で変換して扱うのが一般的なテクニックです。
データを追加・取得する(CRUD操作)¶
テーブルができたら、いよいよ中身を操作していきましょう。 データの作成(Create)、読み出し(Read)、更新(Update)、削除(Delete)の頭文字をとってCRUD(クラッド)と呼びます。
これらはプログラミングにおけるデータ操作の基本中の基本です。 一つずつ、具体的な書き方を見ていきましょう。
データの挿入(INSERT)¶
新しいユーザーを登録するような場面で使います。 ここで初心者が最も注意すべきなのが、SQLインジェクションというセキュリティの罠です。
# 良い例:プレースホルダ(?)を使う
user_data = ('Alice', 25, 'alice@example.com')
cur.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?);", user_data)
# 悪い例:f-stringで直接埋め込む(危険!)
# name = "Alice"
# cur.execute(f"INSERT INTO users ... VALUES ('{name}', ...)")
変数を直接SQL文の中に埋め込むと、悪意のある入力によってデータベースが破壊される恐れがあります。 必ず?マークを使ったプレースホルダを利用する癖をつけてください。
データの取得(SELECT)¶
保存したデータを取り出す作業です。
SELECT文を実行した後、カーソルからデータを引き出す動作が必要になります。
# すべてのデータを取得
cur.execute("SELECT * FROM users;")
# 1件ずつ取り出す
for row in cur.fetchall():
print(row)
# 出力例: (1, 'Alice', 25, 'alice@example.com')
fetchall()はすべての結果をリストとして取得します。
データが大量にある場合は、1件ずつ取り出すfetchone()を使うなどして、メモリを節約するのがプロの技です。
データの更新と削除でメンテナンスを行う¶
一度入れたデータが一生そのままということはありません。 年齢が変われば更新し、不要になれば削除するのがデータのライフサイクルです。
ただし、これらの操作には常にWHERE句(条件)を忘れないようにしましょう。 条件を付け忘れると、テーブル内の全データが書き換わったり消えたりするという大惨事が起きます。
データの更新(UPDATE)¶
特定のユーザーの情報を書き換えます。 例えば、IDが1のユーザーのメールアドレスを変更してみましょう。
new_email = 'new_alice@example.com'
user_id = 1
cur.execute("UPDATE users SET email = ? WHERE id = ?;", (new_email, user_id))
conn.commit()
commit()を呼び出すまでは、変更はまだ仮の状態です。
やっぱり今の操作は間違いだった!と思ったら、conn.rollback()で元に戻すこともできます。
データの削除(DELETE)¶
不要な行を削除します。 これも更新と同様に、条件指定が命です。
cur.execute("DELETE FROM users WHERE id = ?;", (user_id,))
conn.commit()
削除はやり直しがきかない操作なので、実行前に一度SELECTで対象を確認することをおすすめします。
私も若手の頃、条件を間違えてテストデータを全消去し、真っ青になったことがあります。
実践:家計簿プログラムを作ってみよう¶
座学だけでは身につかないので、簡単な実践例を作成してみましょう。 日付、項目、金額を記録するシンプルな家計簿システムです。
このサンプルには、これまで学んだ接続、作成、挿入、取得のすべてが含まれています。 自分の手で動かしてみることで、各パーツの役割がより深く理解できるはずです。
import sqlite3
from datetime import datetime
def init_db():
conn = sqlite3.connect('kakeibo.db')
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date TEXT,
item TEXT,
amount INTEGER
)
""")
conn.commit()
return conn
def add_item(conn, item, amount):
cur = conn.cursor()
date = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
cur.execute("INSERT INTO history (date, item, amount) VALUES (?, ?, ?)", (date, item, amount))
conn.commit()
def show_all(conn):
cur = conn.cursor()
cur.execute("SELECT * FROM history")
for row in cur.fetchall():
print(f"{row[1]} | {row[2]}: {row[3]}円")
# 実行
db_conn = init_db()
add_item(db_conn, 'ランチ', 1200)
add_item(db_conn, '書籍', 2500)
show_all(db_conn)
db_conn.close()
どうでしょうか。 わずか数十行のコードで、本格的なデータ保存機能を持ったツールが出来上がりました。
これを応用すれば、TODOアプリや読書記録、Webスクレイピングしたデータの保存など、可能性は無限に広がります。 自分のやりたいことと結びつけるのが、上達の最短ルートですよ。
SQLiteの真の価値¶
最後に、一歩進んだ視点からSQLiteについてお話しします。 プログラミングを続けていくと、いつかはMySQLやPostgreSQLといった大規模なデータベースに移行する日が来るかもしれません。
しかし、SQLiteを使いこなせる技術は、決して無駄にはなりません。 なぜなら、SQLiteは単なる初心者向けの道具ではないからです。
プロトタイピングの最強ツール¶
新しいアプリのアイデアを思いついたとき、データベースの設定に数時間を費やすのはもったいないです。 SQLiteなら秒速で開発をスタートでき、試行錯誤のスピードを最大化できます。
ビジネスの世界では速さが正義になることが多々あります。 サクッと作って動かせるSQLiteの技術は、現場で非常に重宝されます。
モバイルアプリや組み込みの標準¶
iPhoneやAndroidのアプリ、さらにはブラウザの内部など、実は世界中で最も使われているデータベースはSQLiteだと言われています。 あなたが毎日使っているスマホの中でも、この仕組みが動いているのです。
基礎をここで固めておくことで、将来モバイル開発やIoTの世界に進んだとき、大きなアドバンテージになるでしょう。 まずはこの小さなファイル一つから、大きな世界への扉を開いてみてください。
まとめ:まずは触ってみることから始めよう¶
SQLiteとPythonの組み合わせは、データ管理の第一歩としてこれ以上ない選択肢です。 最初はSQL文の書き方に戸惑うかもしれませんが、基本のCRUDさえ押さえれば、あとはパズルのようなものです。
まずは、今日学んだコードを自分のPCで実行してみてください。
example.dbというファイルが生成された瞬間に、あなたはデータベースエンジニアへの一歩を踏み出しています。
難しいと感じたら、まずは司書さんに命令を出すというイメージだけで大丈夫です。 一歩ずつ、楽しみながら学んでいきましょう。
ここまでお読みいただき、ありがとうございました!