はじめに
SQLiteは、リレーショナルデータベースをシンプルかつ効率的に管理できることで知られる人気のデータベースエンジンです。組み込み型のSQLデータベースエンジンであるため、アプリケーション内で直接使われることが多く、別のサーバープロセスを必要としない軽量なデータベースソリューションを提供します。このチュートリアルでは、SQLiteデータベース内のテーブル一覧を表示する方法を解説します。既存のデータベースの構造を把握するときやデバッグ時によく行う作業です。
前提条件
SQLiteがインストールされ、利用できる状態である必要があります。SQLiteデータベースは、コマンドライン、Pythonスクリプト、Beekeeper StudioのようなGUIツールなど、さまざまな方法で操作できます。このガイドでは、どこでも利用できるSQLiteのコマンドラインツールを使用します。
SQLiteデータベースにアクセスする
まず、ターミナルまたはコマンドプロンプトを開き、SQLiteのコマンドラインツールでデータベースにアクセスします。データベースの操作を開始する一般的なコマンドは次のとおりです。
sqlite3 your_database_file.db
‘your_database_file.db’ をSQLiteデータベースファイルのパスに置き換えてください。
.tables コマンドでテーブルを一覧表示する
SQLiteには、アクティブなデータベース内のすべてのテーブルを簡単に一覧表示できる .tables コマンドが用意されています。
SQLiteのコマンドラインシェルで、次のように入力します。
.tables
このコマンドを実行すると、SQLite は現在のデータベース内のすべてのテーブル名を一覧で返します。
出力例:(サンプルデータベース ‘sakila.db’ を使用)
actor experiments payment
address film rental
category film_actor sales_by_film_category
city film_category sales_by_store
country film_list staff
customer film_text staff_list
customer_list inventory store
events language
.tables コマンドの仕組み
SQLiteは、メインデータベースとアタッチされたデータベース内のすべてのテーブルとビューの名前を返すようデータベースに指示します。内部的には、sqlite_master テーブルに対して SELECT コマンドを実行しています。
sqlite_master テーブルをクエリする
より細かく制御したい場合は、テーブル定義を含むデータベースのメタデータを格納している ‘sqlite_master’ テーブルを直接クエリできます。
例:
SELECT name FROM sqlite_master WHERE type='table';
このSQLコマンドは、sqlite_master テーブルのうち type が ‘table’ であるレコードの name 列をすべて取得します。
出力例:(サンプルデータベース ‘sakila.db’ を使用)
---------------
actor
sqlite_sequence
country
city
address
language
category
customer
film
film_actor
film_category
film_text
inventory
staff
store
payment
rental
experiments
events
.schema コマンドでテーブルスキーマを表示する
テーブルの構造、つまり ‘スキーマ’(テーブルの列とそれぞれのデータ型)を確認するには、SQLiteの .schema コマンドを使います。
.schema your_table_name
出力例:(サンプルデータベース ‘sakila.db’ の ‘actor’ テーブルを使用)
CREATE TABLE actor (
actor_id integer PRIMARY KEY AUTOINCREMENT NOT NULL,
first_name VARCHAR(45) NOT NULL,
last_name VARCHAR(45) NOT NULL,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
, "email_address" VARCHAR(255) NULL);
CREATE INDEX idx_actor_last_name ON actor(last_name)
;
CREATE TRIGGER actor_trigger_ai AFTER INSERT ON actor
BEGIN
UPDATE actor SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
END;
CREATE TRIGGER actor_trigger_au AFTER UPDATE ON actor
BEGIN
UPDATE actor SET last_update = DATETIME('NOW') WHERE rowid = new.rowid;
END;
‘your_table_name’ をテーブル名に置き換えてください。
このコマンドは、データベースでそのテーブルを作成した際の CREATE TABLE 文を返します。
SELECT文を使う
別の方法として、sqlite_master テーブルに対する SELECT 文でスキーマを取得することもできます。
SELECT sql FROM sqlite_master WHERE name = 'your_table_name';
このコマンドは、.schema コマンドと同じCREATE TABLE文を、‘INDEX’ と ‘TRIGGER’ 文を除いて返します。
PRAGMA コマンドでテーブル情報を取得する
SQLiteでは、データベースのさまざまな特性を取得できる PRAGMA コマンドを使う方法もあります。便利なPRAGMAコマンドの1つが ‘table_info’ で、テーブルの列に関する情報を取得できます。
‘table_info’ はテーブルを一覧表示するものではありませんが、テーブル一覧のコマンドと組み合わせることで、テーブル名を見つけた直後にその構造を把握できます。
例:
PRAGMA table_info('actor');
出力例:(サンプルデータベース ‘sakila.db’ の ‘actor’ テーブルを使用)
cid name type notnull dflt_value pk
--- ------------- ------------ ------- ----------------- --
0 actor_id INTEGER 1 1
1 first_name VARCHAR(45) 1 0
2 last_name VARCHAR(45) 1 0
3 last_update TIMESTAMP 1 CURRENT_TIMESTAMP 0
4 email_address VARCHAR(255) 0 0
各行は ‘actor’ テーブルの1つの列を表し、各フィールドはそれぞれ列の ‘cid’、‘name’、‘type’、‘not null’ の状態、‘default value’、‘primary key’ の情報を示しています。
まとめ
SQLiteでテーブルを一覧表示することは、データベースの管理や調査に欠かせない基本スキルです。手早く一覧を見るなら .tables コマンド、よりプログラム的に扱うなら sqlite_master テーブルへのクエリ、テーブル構造の詳細を知りたいなら PRAGMA 文と、SQLiteにはデータベースを理解し効率よく操作するためのさまざまなツールが揃っています。
SQLiteのテーブルを確認するためのSQLコマンドを理解して書くことにはやりがいがありますが、特に大規模なデータベースを扱う場合は、時間がかかり複雑にもなりがちです。
Beekeeper Studioなら、使いやすいインターフェースでデータベース内のテーブルを扱えるため、多数のテーブルもスムーズに確認できます。
さらに、テーブル名をクリックするだけで、そのテーブルのスキーマが見やすく整理された形式で表示されます。
Beekeeper Studioは無料&オープンソースのSQLite GUIです
まさに求めていたものです。UIはキビキビしていてすっきり、期待どおりに動き、しっかり仕事をこなしてくれます。SQLiteデータベースを扱うのに最適なツールです。 - Andy
Beekeeper Studioは、高速で直感的、使いやすいSQLiteクライアントです。ほかにも多数のデータベースに対応し、Windows、Mac、Linuxで快適に動作します。
Beekeeper StudioについてのSQLite利用者の声
これを使ってデータベースのクエリや閲覧をするようになって、初めてモデル設計の仕組みを本当に理解できました!学習の道のりでとても助かっています。今のところDjango + sqliteでしか使っていないので、それらを学んでいる人におすすめします。
重要な点は2つあります。1つ目は接続性です。SQLiteにはDB Browser for SQLite、MySQLにはMySQL Workbench、PostgreSQLにはpsqlと使い分ける必要がありません。Beekeeperならすべてに対応しています。2つ目はAIです。AI機能が英語をSQLに変換してくれます。