SQLiteでテーブル一覧を確認する方法|データベース構造の把握に便利な基本操作を解説

データベース・SQL

「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

基本的な使い方

  1. インストール
    • 公式サイトからダウンロード
    • Windows、Mac、Linuxに対応
    • 無料で使用可能
  2. データベースを開く
    • File > Open Database
    • .dbファイルを選択
  3. テーブル一覧の確認
    • 「Database Structure」タブを開く
    • 左側にテーブル一覧が表示
    • テーブル名をクリックで詳細確認

便利な機能

  • テーブル構造の視覚的表示
  • データの直接編集機能
  • SQL実行とクエリ結果表示
  • データのインポート・エクスポート

SQLite Studio

特徴と使い方

  1. 軽量で高機能
    • ポータブル版も利用可能
    • 多機能でありながら軽快動作
  2. テーブル確認機能
    • 左側のデータベースツリーでテーブル一覧
    • 右クリックメニューで詳細操作
    • テーブル間のリレーション表示

VSCode 拡張機能

SQLite Viewer 拡張機能

# 拡張機能のインストール
# VSCode で "SQLite Viewer" を検索してインストール

使い方

  1. VSCodeで.dbファイルを開く
  2. 自動的にSQLite Viewerが起動
  3. テーブル一覧とデータを直接確認
  4. 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でのテーブル一覧表示は、データベース構造を把握するための基本操作です。

方法特徴適用場面おすすめ度
.tablesSQLiteシェルでの簡易表示コマンドライン作業★★★
sqlite_masterSQL文での一覧取得プログラム内での処理★★★
.schemaテーブル構造の詳細確認設計確認・デバッグ★★☆
GUIツール視覚的なデータベース操作初心者・データ確認★★☆

使い分けのポイント

  • コマンドライン作業.tablesコマンドが最適
  • プログラム内処理sqlite_masterテーブルを活用
  • 構造の詳細確認.schemaやPRAGMA文を使用
  • 初心者・視覚的確認:GUIツールが便利

コメント

タイトルとURLをコピーしました