INDEX
SQLiteでテーブルを作成する方法

Pythonで手軽にリレーショナルデータベース(RDB)を扱いたい場合、最も有力な選択肢となるのがSQLiteです。SQLiteはファイルベースの軽量なデータベースであり、外部サーバーを立てることなく、Pythonの標準ライブラリ sqlite3 を使うだけで構築・操作が可能です。
データベースを操作する上で、データを整理して格納するための「器」となるのがテーブル(Table)です。本記事では、Pythonを使ってSQLiteデータベースへ接続し、データの整合性を保つための適切なデータ型や制約を指定してテーブルを作成する、実務的な一連の手順を解説します。
テーブルを作成する一連のシステムフロー
SQLiteでテーブルを構築する際は、プログラム内で以下の4つのステップを順番に実行していく必要があります。
-
- データベースへの接続:
connect()を呼び出し、データを保存するファイル(.db)とのパイプラインを確立します。
- データベースへの接続:
- カーソルの生成とSQLの実行: データベースを操作する「手」の役割を果たすカーソル(Cursor)オブジェクトを作成し、テーブル定義のSQL文(
CREATE TABLE)を発行します。 - トランザクションのコミット: 実行した操作をデータベースファイルへ完全に書き込み、確定(Commit)させます。
- リソースの解放(クローズ): 接続を安全に閉じ、メモリやファイルロックを解放します。
Python(sqlite3)による実装コード例
ユーザー情報を管理するための users テーブルを新規構築する、標準的なスクリプト構造です。
import sqlite3
# 1. データベースファイルへの接続(指定したファイルがない場合は自動生成されます)
# 実務では、データの文字コード崩れを防ぐためにもファイルベースでの管理が基本です
conn = sqlite3.connect('development.db')
# 2. SQLを実行するためのカーソル(Cursor)オブジェクトを生成
cursor = conn.cursor()
# 3. SQL文を構築して実行
# 💡 「IF NOT EXISTS」を付けることで、すでにテーブルがある場合に2重作成エラーになるのを防ぎます
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
# 4. 行った変更(テーブル作成やデータ挿入など)を確定してファイルに書き込む
conn.commit()
# 5. 使い終わったカーソルと接続を確実に閉じる(リソースリークの防止)
cursor.close()
conn.close()
知っておくべきSQLiteの主要データ型と制約
SQLiteは他の巨大なRDB(MySQLやPostgreSQLなど)に比べて、データ型が非常にシンプル(5種類のみ)に割り切られているのが特徴です。また、データの不正混入を防ぐための「制約(Constraints)」の設計が極めて重要になります。
主要なデータ型(ストレージクラス)
INTEGER: 符号付き整数。識別用のIDや、年齢、数量などに使用します。TEXT: 文字列。名前、住所、メールアドレスなどに使用(UTF-8などの文字コードで保存されます)。REAL: 浮動小数点数。緯度・経度や、精密な計算が必要な数値に使用します。BLOB: バイナリデータ。画像ファイルや音声データなどをそのままバイナリとして格納する場合に使用します。NULL: 値が存在しない(空である)状態を示します。
実務で必須となるカラム制約
PRIMARY KEY(主キー): そのテーブル内で、データを1件ずつ絶対に重複なく識別するためのキーとなる列に指定します(例:会員ID)。AUTOINCREMENTを併記すると、データが追加されるたびに1, 2, 3...と自動で連番を振ってくれます。NOT NULL: 「この列は空欄(NULL)での登録を絶対に許さない」という強制ルールです。名前やパスワードなど、システム上必須となるデータに付与します。UNIQUE: テーブル内で同じ値の重複を禁止します。メールアドレスやユーザーIDなど、他の人と絶対に被ってはいけない項目に使用します。DEFAULT: データ挿入時にその列の値が省略された場合、自動的に身代わりとして入る初期値を設定します(例:CURRENT_TIMESTAMPでデータ登録時の一意のシステム時刻を自動記録)。
実務の安全対策:with構文による例外処理とクローズの自動化
ファイルの読み書きと同様に、データベース操作も処理の途中でエラーが発生した場合、close() が呼ばれずにファイルがロックされたままになるリスクがあります。
Pythonの sqlite3 では、with 構文(コンテキストマネージャ)に対応しており、ブロック内で例外(SQLエラーなど)が起きると自動的に処理を巻き戻し(ロールバック)、安全に接続を閉じてくれます。
import sqlite3
# 接続フェーズで with 構文を適用
with sqlite3.connect('development.db') as conn:
cursor = conn.cursor()
try:
cursor.execute('''
CREATE TABLE IF NOT EXISTS別テーブル (
id INTEGER PRIMARY KEY
)
''')
# with 構文(接続オブジェクト)のブロックを正常に抜けると、
# 背後で自動的に conn.commit() が実行されます。
print("テーブルの作成に成功しました。")
except sqlite3.Error as e:
# 万が一SQL文にタイポ(書き間違い)などの不備があれば、ここでエラーを安全にキャッチ
print(f"データベースエラーが発生しました: {e}")
# ブロックを抜けた時点で、ファイルロックは安全に解放されています
まとめ
- ファイルベースの強みを活かす: SQLiteは
sqlite3.connect('ファイル名')と書くだけでローカルに即座に環境が作れるため、プロトタイプ開発や社内ツールのデータ保存先として最高のパフォーマンスを発揮します。 - 堅牢なスキーマ(構造)設計を行う: テーブルを作る際は、単にカラムを並べるだけでなく、データの品質を維持するために
PRIMARY KEYやNOT NULL、UNIQUEといったデータベース層でのガード(制約)を適切に設計する思考を常に持ってください。 - トランザクションとクローズの徹底:
CREATE TABLEを実行した後は、忘れずにcommit()を行う(またはwith構文を使用する)ことで、初めてファイルに物理的な変更が適用されます。データの整合性を守るための作法としてマスターしましょう。