「SQLiteの中にどんなテーブルがあるのか知りたい」
「作成したテーブルが正しく登録されたか確認したい」
そんなときに便利なのが、SQLiteでテーブル一覧を表示する方法です。
この記事では、SQLiteのテーブル一覧取得方法・内部構造の確認・注意点まで、実例を交えてわかりやすく解説します。
SQLiteでテーブル一覧が必要になる場面
よくある使用場面
開発・保守作業でのニーズ
- 新しいプロジェクトでデータベース構造を把握したい
- 作成したテーブルが正しく登録されているか確認したい
- 既存システムのテーブル設計を調査したい
- データベースの移行作業で構造を比較したい
学習・研究での活用
- SQLiteの基本操作を覚えたい
- サンプルデータベースの中身を確認したい
- 他の人が作ったデータベースを理解したい
- テーブル設計の参考にしたい
トラブルシューティング
- エラーが発生してテーブルの存在を確認したい
- データが見つからない原因を調べたい
- アプリケーションが正しく動作しない理由を調査したい
SQLiteコマンドラインでの基本操作
.tablesコマンドの使い方
基本的なコマンド
# SQLiteを起動
sqlite3 データベース名.db
# テーブル一覧を表示
.tables
実行例
$ sqlite3 sample.db
SQLite version 3.39.0 2022-06-25 14:57:57
Enter ".help" for usage hints.
sqlite> .tables
customers orders products sales
パターンを指定した検索
# 特定の文字を含むテーブルのみ表示
.tables sale* # "sale"で始まるテーブル
.tables *data # "data"で終わるテーブル
.tables *user* # "user"を含むテーブル
実行結果の例
sqlite> .tables sale*
sales sales_2023 sales_backup
sqlite> .tables *user*
user_accounts user_profiles admin_users
より詳細な情報を取得する方法
テーブル詳細情報の表示
# テーブルの構造を確認
.schema テーブル名
# 全テーブルの構造を一度に確認
.schema
# データベース全体の情報
.database
実行例
sqlite> .schema customers
CREATE TABLE customers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
SQL文でテーブル一覧を取得する方法
sqlite_masterテーブルの活用
基本的なSQL文
-- すべてのテーブル一覧
SELECT name FROM sqlite_master
WHERE type = 'table'
ORDER BY name;
実行結果の例
name
----------
customers
orders
products
sales
より詳細な情報を取得
-- テーブル作成日時や構造も含めて取得
SELECT
name AS テーブル名,
sql AS 作成文
FROM sqlite_master
WHERE type = 'table'
ORDER BY name;
実行結果の例
テーブル名 | 作成文
----------|--------------------------------------------------
customers | CREATE TABLE customers (id INTEGER PRIMARY KEY...)
orders | CREATE TABLE orders (order_id INTEGER...)
products | CREATE TABLE products (product_id INTEGER...)
特定条件でのテーブル検索
条件を指定した検索
-- 特定の文字を含むテーブルを検索
SELECT name FROM sqlite_master
WHERE type = 'table'
AND name LIKE '%user%'
ORDER BY name;
-- システムテーブルを除外
SELECT name FROM sqlite_master
WHERE type = 'table'
AND name NOT LIKE 'sqlite_%'
ORDER BY name;
テーブルの存在確認
-- 特定のテーブルが存在するかチェック
SELECT COUNT(*) AS table_exists
FROM sqlite_master
WHERE type = 'table'
AND name = 'customers';
-- 存在する場合は1、しない場合は0が返る
プログラムからのテーブル一覧取得
Python での実装例
基本的な取得方法
import sqlite3
def get_table_list(db_path):
"""SQLiteデータベースのテーブル一覧を取得"""
try:
# データベースに接続
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# テーブル一覧を取得
cursor.execute("""
SELECT name FROM sqlite_master
WHERE type = 'table'
ORDER BY name
""")
tables = cursor.fetchall()
# テーブル名のリストとして返す
table_list = [table[0] for table in tables]
return table_list
except sqlite3.Error as e:
print(f"データベースエラー: {e}")
return []
finally:
if conn:
conn.close()
# 使用例
db_file = "sample.db"
tables = get_table_list(db_file)
print("テーブル一覧:")
for table in tables:
print(f"- {table}")
詳細情報を含む取得
def get_table_info(db_path):
"""テーブル一覧と詳細情報を取得"""
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# テーブル情報を取得
cursor.execute("""
SELECT
name,
sql,
CASE
WHEN sql LIKE '%PRIMARY KEY%' THEN 'あり'
ELSE 'なし'
END as primary_key
FROM sqlite_master
WHERE type = 'table'
ORDER BY name
""")
tables = cursor.fetchall()
for table in tables:
print(f"テーブル名: {table[0]}")
print(f"主キー: {table[2]}")
print(f"作成文: {table[1][:50]}...")
print("-" * 50)
conn.close()
# 実行例
get_table_info("sample.db")
JavaScript での実装例
Node.js + better-sqlite3 での例
const Database = require('better-sqlite3');
function getTableList(dbPath) {
try {
const db = new Database(dbPath);
// テーブル一覧を取得
const stmt = db.prepare(`
SELECT name FROM sqlite_master
WHERE type = 'table'
ORDER BY name
`);
const tables = stmt.all();
db.close();
return tables.map(row => row.name);
} catch (error) {
console.error('データベースエラー:', error);
return [];
}
}
// 使用例
const dbFile = 'sample.db';
const tables = getTableList(dbFile);
console.log('テーブル一覧:');
tables.forEach(table => {
console.log(`- ${table}`);
});
テーブル構造の詳細確認方法
個別テーブルの構造確認
コマンドライン操作
# 特定テーブルの列情報
.schema customers
# テーブルの詳細情報(列名、型、制約など)
PRAGMA table_info(customers);
PRAGMA table_info の実行結果例
cid | name | type | notnull | dflt_value | pk
----|------------|---------|---------|------------|----
0 | id | INTEGER | 0 | | 1
1 | name | TEXT | 1 | | 0
2 | email | TEXT | 0 | | 0
3 | created_at | DATETIME| 0 | CURRENT_T..| 0
SQL文での構造確認
-- テーブルの作成文を取得
SELECT sql FROM sqlite_master
WHERE type = 'table' AND name = 'customers';
-- テーブルの列情報を詳しく取得
PRAGMA table_info(customers);
-- インデックス情報も含めて確認
SELECT
m.name AS object_name,
m.type AS object_type,
m.sql AS definition
FROM sqlite_master m
WHERE m.tbl_name = 'customers'
ORDER BY m.type, m.name;
全テーブルの構造を一括確認
包括的な構造確認SQL
-- 全テーブルの基本情報
SELECT
name AS テーブル名,
CASE
WHEN sql LIKE '%PRIMARY KEY%' THEN 'あり'
ELSE 'なし'
END AS 主キー,
LENGTH(sql) - LENGTH(REPLACE(sql, ',', '')) + 1 AS 推定列数
FROM sqlite_master
WHERE type = 'table'
ORDER BY name;
Python での全テーブル構造確認
def analyze_all_tables(db_path):
"""全テーブルの構造を分析"""
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# テーブル一覧を取得
cursor.execute("""
SELECT name FROM sqlite_master
WHERE type = 'table'
ORDER BY name
""")
tables = cursor.fetchall()
for table in tables:
table_name = table[0]
print(f"\n=== {table_name} ===")
# 列情報を取得
cursor.execute(f"PRAGMA table_info({table_name})")
columns = cursor.fetchall()
print("列情報:")
for col in columns:
col_name = col[1]
col_type = col[2]
not_null = "NOT NULL" if col[3] else "NULL可"
pk = "主キー" if col[5] else ""
print(f" - {col_name}: {col_type} {not_null} {pk}")
# レコード数を確認
cursor.execute(f"SELECT COUNT(*) FROM {table_name}")
count = cursor.fetchone()[0]
print(f"レコード数: {count}")
conn.close()
# 実行例
analyze_all_tables("sample.db")
GUIツールでの確認方法
DB Browser for SQLite
基本的な使い方
- インストール
- 公式サイトからダウンロード
- Windows、Mac、Linuxに対応
- 無料で使用可能
- データベースを開く
- File > Open Database
- .dbファイルを選択
- テーブル一覧の確認
- 「Database Structure」タブを開く
- 左側にテーブル一覧が表示
- テーブル名をクリックで詳細確認
便利な機能
- テーブル構造の視覚的表示
- データの直接編集機能
- SQL実行とクエリ結果表示
- データのインポート・エクスポート
SQLite Studio
特徴と使い方
- 軽量で高機能
- ポータブル版も利用可能
- 多機能でありながら軽快動作
- テーブル確認機能
- 左側のデータベースツリーでテーブル一覧
- 右クリックメニューで詳細操作
- テーブル間のリレーション表示
VSCode 拡張機能
SQLite Viewer 拡張機能
# 拡張機能のインストール
# VSCode で "SQLite Viewer" を検索してインストール
使い方
- VSCodeで.dbファイルを開く
- 自動的にSQLite Viewerが起動
- テーブル一覧とデータを直接確認
- SQL実行も可能
一時テーブルとビューの確認
一時テーブルの一覧取得
一時テーブルの確認方法
-- 一時テーブルの一覧
SELECT name FROM sqlite_temp_master
WHERE type = 'table'
ORDER BY name;
-- 通常のテーブルと一時テーブルを両方表示
SELECT
name,
'通常' AS type
FROM sqlite_master
WHERE type = 'table'
UNION ALL
SELECT
name,
'一時' AS type
FROM sqlite_temp_master
WHERE type = 'table'
ORDER BY name;
ビューの一覧取得
ビューの確認
-- ビューの一覧
SELECT name FROM sqlite_master
WHERE type = 'view'
ORDER BY name;
-- テーブルとビューを区別して表示
SELECT
name,
type
FROM sqlite_master
WHERE type IN ('table', 'view')
ORDER BY type, name;
包括的なオブジェクト一覧
-- データベース内の全オブジェクト
SELECT
name AS オブジェクト名,
type AS 種類,
CASE type
WHEN 'table' THEN 'テーブル'
WHEN 'view' THEN 'ビュー'
WHEN 'index' THEN 'インデックス'
WHEN 'trigger' THEN 'トリガー'
ELSE type
END AS 日本語名
FROM sqlite_master
WHERE name NOT LIKE 'sqlite_%'
ORDER BY type, name;
エラー対処とトラブルシューティング
よくあるエラーとその対処法
問題1:データベースファイルが見つからない
# エラー例
$ sqlite3 notfound.db
sqlite3: can't open database "notfound.db": unable to open database file
# 対処法:ファイルパスを確認
$ ls -la *.db # データベースファイルの存在確認
$ sqlite3 ./path/to/database.db # 正しいパスを指定
問題2:権限エラー
# エラー例
sqlite3: can't open database "readonly.db": Permission denied
# 対処法:ファイル権限を確認・変更
$ ls -la readonly.db # 権限確認
$ chmod 644 readonly.db # 読み込み権限を付与
問題3:データベースが壊れている場合
-- データベースの整合性チェック
PRAGMA integrity_check;
-- 問題がある場合の修復コマンド
.backup backup.db -- バックアップ作成
.restore backup.db -- バックアップから復元
プログラムでのエラーハンドリング
Python での例外処理
import sqlite3
import os
def safe_get_tables(db_path):
"""安全にテーブル一覧を取得"""
# ファイル存在チェック
if not os.path.exists(db_path):
print(f"エラー: {db_path} が見つかりません")
return []
try:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# データベース接続テスト
cursor.execute("SELECT 1")
# テーブル一覧取得
cursor.execute("""
SELECT name FROM sqlite_master
WHERE type = 'table'
ORDER BY name
""")
tables = [row[0] for row in cursor.fetchall()]
return tables
except sqlite3.DatabaseError as e:
print(f"データベースエラー: {e}")
return []
except Exception as e:
print(f"予期しないエラー: {e}")
return []
finally:
if 'conn' in locals():
conn.close()
# 使用例
tables = safe_get_tables("sample.db")
if tables:
print("テーブル一覧:")
for table in tables:
print(f" - {table}")
else:
print("テーブルが見つからないか、エラーが発生しました")
パフォーマンスと最適化
大量テーブルでの効率的な確認
LIMIT を使った確認
-- テーブル数が多い場合は制限をかける
SELECT name FROM sqlite_master
WHERE type = 'table'
ORDER BY name
LIMIT 10;
-- 特定パターンのみ確認
SELECT name FROM sqlite_master
WHERE type = 'table'
AND name LIKE 'user_%'
ORDER BY name;
インデックスの活用
-- sqlite_master にはデフォルトでインデックスが存在
-- 大量のテーブルがある場合でも高速に検索可能
-- 実際のインデックス確認
PRAGMA index_list(sqlite_master);
メタ情報の効率的な取得
統計情報の一括取得
-- データベース全体の統計
SELECT
COUNT(*) AS テーブル数
FROM sqlite_master
WHERE type = 'table';
-- 種類別の統計
SELECT
type AS オブジェクト種類,
COUNT(*) AS 数
FROM sqlite_master
GROUP BY type
ORDER BY COUNT(*) DESC;
実践的な活用例
データベース構造の文書化
自動文書生成スクリプト
def generate_db_documentation(db_path, output_file):
"""データベース構造の文書を自動生成"""
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
with open(output_file, 'w', encoding='utf-8') as f:
f.write("# データベース構造ドキュメント\n\n")
# テーブル一覧を取得
cursor.execute("""
SELECT name FROM sqlite_master
WHERE type = 'table'
ORDER BY name
""")
tables = cursor.fetchall()
for table in tables:
table_name = table[0]
f.write(f"## {table_name}\n\n")
# テーブル構造を取得
cursor.execute(f"PRAGMA table_info({table_name})")
columns = cursor.fetchall()
f.write("| 列名 | 型 | NULL許可 | デフォルト値 | 主キー |\n")
f.write("|------|----|---------|-----------|---------|\n")
for col in columns:
col_name = col[1]
col_type = col[2]
not_null = "×" if col[3] else "○"
default = col[4] if col[4] else "-"
pk = "○" if col[5] else "-"
f.write(f"| {col_name} | {col_type} | {not_null} | {default} | {pk} |\n")
# レコード数を追加
cursor.execute(f"SELECT COUNT(*) FROM {table_name}")
count = cursor.fetchone()[0]
f.write(f"\n**レコード数**: {count}\n\n")
conn.close()
print(f"文書が {output_file} に生成されました")
# 実行例
generate_db_documentation("sample.db", "database_structure.md")
データベース比較ツール
二つのデータベース構造を比較
def compare_databases(db1_path, db2_path):
"""二つのデータベースのテーブル構造を比較"""
def get_db_tables(db_path):
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute("""
SELECT name FROM sqlite_master
WHERE type = 'table'
ORDER BY name
""")
tables = set(row[0] for row in cursor.fetchall())
conn.close()
return tables
tables1 = get_db_tables(db1_path)
tables2 = get_db_tables(db2_path)
print(f"データベース1のテーブル数: {len(tables1)}")
print(f"データベース2のテーブル数: {len(tables2)}")
# 差分を確認
only_in_db1 = tables1 - tables2
only_in_db2 = tables2 - tables1
common_tables = tables1 & tables2
if only_in_db1:
print(f"\nデータベース1のみ: {', '.join(only_in_db1)}")
if only_in_db2:
print(f"\nデータベース2のみ: {', '.join(only_in_db2)}")
print(f"\n共通テーブル数: {len(common_tables)}")
# 実行例
compare_databases("old_version.db", "new_version.db")
まとめ
SQLiteでのテーブル一覧表示は、データベース構造を把握するための基本操作です。
方法 | 特徴 | 適用場面 | おすすめ度 |
---|---|---|---|
.tables | SQLiteシェルでの簡易表示 | コマンドライン作業 | ★★★ |
sqlite_master | SQL文での一覧取得 | プログラム内での処理 | ★★★ |
.schema | テーブル構造の詳細確認 | 設計確認・デバッグ | ★★☆ |
GUIツール | 視覚的なデータベース操作 | 初心者・データ確認 | ★★☆ |
使い分けのポイント
- コマンドライン作業:
.tables
コマンドが最適 - プログラム内処理:
sqlite_master
テーブルを活用 - 構造の詳細確認:
.schema
やPRAGMA文を使用 - 初心者・視覚的確認:GUIツールが便利
コメント