sqlite: SQLite データベースを管理するプログラム

(This page was last modified on 2003/06/29 16:11:13 UTC)

SQLite ライブラリには sqlite というシンプルなコマンドライン ユーティリティが含まれます。これを使うと、ユーザは手作業で SQLite データベースに接続して SQL コマンドを実行できます。この文書では sqlite の使い方に関する概略を紹介しています。

起動する

sqlite を起動するには単に "sqlite" とタイプし、その後ろに SQLite データベースを保持するファイル名を付けます。ファイルが存在 しない場合は、自動的に新しく作られます。起動後 sqlite プログラムは、SQL をタイプするためのプロンプトを表示します。 SQL ステートメント(終了はセミコロン)をタイプし、 "Enter" を押して SQL を実行させます。

たとえば "ex1" という名前の新しい SQLite データベースを作り、 そこに "tbl1" という名前の一個のテーブルを作るには、 以下のようにします:

$ sqlite ex1
SQLite version 2.0.0
Enter ".help" for instructions
sqlite> create table tbl1(one varchar(10), two smallint);
sqlite> insert into tbl1 values('hello!',10);
sqlite> insert into tbl1 values('goodbye', 20);
sqlite> select * from tbl1;
hello!|10
goodbye|20
sqlite>

SQLite プログラムを終了するには、あなたのシステムの End-Of-File (通常は Ctrl-D)もしくは割り込み文字(通常は Ctrl-C)をタイプします。

SQL コマンドの最後にはセミコロンを忘れないようにしましょう! sqlite はセミコロンをもって SQL コマンドの終了とみなします。 もしセミコロンを省略すると、sqlite は継続行を表すプロンプトを表示し、 SQL の現在行に追加するべきテキストの入力待ちになります。 この機能を使い、SQL コマンドを複数行にまたがって書くことができます。 例を見てください:

sqlite> CREATE TABLE tbl2 (
...> f1 varchar(30) primary key,
...> f2 text,
...> f3 real
...> );
sqlite>

コラム:SQLITE_MASTER テーブルに対するクエリー

SQLite データベース内にあるデータベーススキーマは、"sqlite_master" という特別のテーブルに格納されます。このテーブルに対しても、 ほかのテーブルと同様に "SELECT" ステートメントを発行できます。 例を見てください:

$ sqlite ex1
SQlite vresion 2.0.0
Enter ".help" for instructions
sqlite> select * from sqlite_master;
type = table
name = tbl1
tbl_name = tbl1
rootpage = 3
sql = create table tbl1(one varchar(10), two smallint)
sqlite>

しかし sqlite_master テーブルに対する DROP TABLE, UPDATE, INSERT, DELETE はできません。データベースからテーブルやインデックスを生成したり 削除したりするたびに sqlite_master テーブルは自動的に更新されます。 sqlite_master テーブルを手作業で変更することもできません。

TEMPORARY テーブルのスキーマは "sqlite_master" テーブルには格納されません。 そのため TEMPORARY テーブルは、そのテーブルを生成したアプリケーション以外 からは見えません。TEMPORARY テーブルのスキーマは、また別の "sqlite_temp_master" という特別なテーブルに格納されます。 "sqlite_temp_master" テーブルそれ自体も一時的なテーブルです。

sqlite に対する特殊なコマンド

sqlite はその実行中のほとんどの時間を、SQLite ライブラリに渡して 実行するための入力行を読むのに費やしています。しかし、入力行がドット (".")で始まる場合、その行は即座に sqlite プログラム自身によって解析 されます。これら "ドットコマンド" は、そのほとんどがクエリーの 出力フォーマットを変更したり、あらかじめ決められてている特定のクエリー ステートメントを実行するのに使われます。

".help" コマンドを入れることで、 いつでもこれらドットコマンドの一覧を得ることができます。 例を見てください:

sqlite>.help
.databases接続中のデータベースの名前とファイル名の一覧を表示
.dump ?TABLE? ...テキストフォーマットでデータベースをダンプ
.echo ON|OFFコマンドエコーの ON / OFF をトグル
.exitこのプログラムを終了
.explain ON|OFFEXPLAIN に合った出力モードの ON / OFF をトグル
.header(s) ON|OFFヘッダ表示の ON / OFF をトグル
.helpこのメッセージを表示
.indices TABLETABLE に関する全てのインデックス名を表示する
.mode MODE"line", "column", "insert", "list", "html" のいずれかのモードに変える
.mode insert TABLETABLE に対する INSERT ステートメントを生成する
.nullvalue STRINGNULL データに対して何もしない代わりに STRING を表示する
.output FILENAME出力を FILENAME に送る
.output stdout出力を画面に送る
.prompt MAIN CONTINUE標準のプロンプトを置き換える
.quitこのプログラムを終了
.read FILENAMEFILENAME の中の SQL を実行する
.schema ?TABLE?CREATE ステートメントを表示する
.separator STRING"list" モードにおける区切り文字列を変更する
.show各種設定値について、現在の値を表示する
.tables ?PATTERN?パターンにマッチするテーブル名一覧を表示
.timeout MSロックされたテーブルをオープンするのに MS ミリ秒待つ
.width NUM NUM ..."column" モードにおけるカラムの幅を設定する
sqlite>

出力フォーマットを変えてみる

sqlite プログラムは、クエリーの出力を "line", "column", "list", "html", "insert" という5つの異なった書式で表示できます。これらの書式を 切り替えるには ".mode" ドットコマンドを使います。

デフォルトの出力モードは "list" です。 list モードではクエリー結果の各行は 1 行で表示され、 それぞれのカラムは特定の区切り文字列で区切られます。 デフォルトの区切り文字はパイプ文字 ("|") です。 list モードは、クエリーの出力を( AWK などの)別のプログラムに送って さらに処理をさせたい場合などに特に有用です。

sqlite> .mode list
sqlite> select * from tbl1;
hello|10
goodbye|20
sqlite>

".separator" ドットコマンドを使うと、list モードで使われる区切り文字を 変更できます。たとえば区切り文字をカンマと空白にしたい場合は、 以下のようにします。

sqlite> .separator ", "
sqlite> select * from tbl1;
hello, 10
goodbye, 20
sqlite>

"line" モードでは、データベースの行に含まれる各カラムは それぞれが1行として表示されます。 各行はカラム名、等号、データという形式になります。 連続したレコードは空白行で区切られます。 ラインモードの出力例を以下に示します:

sqlite> .mode line
sqlite> select * from tbl1;
one = hello
two = 10

one = goodbye
two = 20
sqlite>

カラムモードでは、各レコードは別々の行に、 カラムごとに桁を揃えて表示されます。 以下のような感じです:


sqlite> .mode column
sqlite> select * from tbl1;
one         two       
----------  ----------
hello       10        
goodbye     20        
sqlite>

デフォルトでは各カラムは少なくとも 10 文字分の幅になります。 データの長さがこれを超えるようなカラムは切り捨てられます。 これを調整するには ".width" コマンドを使います。 以下をご覧下さい:


sqlite> .width 12 6
sqlite> select * from tbl1;
one           two   
------------  ------
hello         10    
goodbye       20    
sqlite>

上記の例では ".width" コマンドで最初のカラムの幅を 12、 次のカラムの幅を 6 にセットしています。 これ以外のカラムについては変更されません。 クエリーの結果にたくさんのカラムが含まれる場合でも、 ".width" に必要な分だけカラム幅を指定できます。

カラムの幅を 0 にした場合、そのカラムの幅は自動的に 10、見出しの幅、 データの最初の行の幅、以上3つの中の最大値に調整されます。 これによりカラム幅の自動調整ができます。幅設定のデフォルトは、 どのカラムについてもこの自動調節を表す 0 に設定されています。

出力の最初の2行はカラムのラベル(見出し)ですが、これは ".header" ドットコマンドを使って表示/非表示を切り替えられます。 上記はカラムラベルが ON になっている例です。 OFF にするには以下のようにします:

sqlite> .header off
sqlite> select * from tbl1;
hello 10
goodbye 20
sqlite>

その他の有用なモードとして "insert" があります。インサートモードでは SQL の INSERT ステートメントと同じ書式で出力が行われます。 インサートモードを使ってテキストデータを作っておくと、 後からこれを別のデータベースへの入力データとして使うことができます。

インサートモードを指定する場合は、 引数として INSERT 対象のテーブル名を指定する必要があります。 以下をご覧下さい:

sqlite> .mode insert new_table
sqlite> select * from tbl1;
INSERT INTO 'new_table' VALUES('hello',10);
INSERT INTO 'new_table' VALUES('goodbye',20);
sqlite>

最後にご紹介するのは "html" モードです。このモードでは sqlite はクエリー結果を XHTML テーブル形式で出力します。 最初の <TABLE> と最後の </TABLE> は出力されませんが、 途中にある <TR>s, <TH>s, <TD>s はすべて出力されます。 html 出力モードは CGI で使うのに便利でしょう。

結果をファイルに書き出す

デフォルトでは sqlite はクエリーの結果を標準出力に出力します。 ".output" コマンドを使えばこの出力先を変更できます。 単に出力ファイルの名前を .output コマンドの引数として指定すれば、 それ以降のクエリー結果はそのファイルに書き出されます。 ".output stdout" とすれば、また標準出力に戻ります。 以下に例をあげます:

sqlite> .mode list
sqlite> .separator |
sqlite> .output test_file_1.txt
sqlite> select * from tbl1;
sqlite> .exit
$ cat test_file_1.txt
hello|10
goodbye|20
$

データベーススキーマの問い合わせ

sqlite プログラムには、データベースのスキーマを問い合わせるための 便利なコマンドがいくつか用意されています。これらのコマンドで できることのうち、ほかの方法ではできないということは何もありません。 これらのコマンドは、単にショートカットとして用意されているだけです。

たとえば、データベースの中のテーブル一覧を見るためには ".tables" とタイプします。

sqlite> .tables
tbl1
tbl2
sqlite>

".tables" コマンドは、list モードにしてから以下のクエリーを 発行するのと同じです:

SELECT name FROM sqlite_master WHERE type='table' 
UNION ALL SELECT name FROM sqlite_temp_master WHERE type='table'
ORDER BY name;

実際、sqlite プログラムのソースコード( ソースツリーの src/shell.c ファイルにあります)を見れば、前述のクエリーと同じものが見つかるはずです。

".indices" コマンドは特定のテーブルに関するすべてのインデックスの一覧を 表示します。".indices" コマンドは、引数としてインデックスを表示したい テーブル名を取ります。最後に登場するのは ".schema" コマンドです。 引数を指定しない場合、".schema" コマンドは現在のデータベースを構築する 時に使用したオリジナルの CREATE TABLE と CREATE INDEX ステートメントを 表示します。".schema" に引数としてテーブル名を指定すると、そのテーブル に関するCREATE TABLE ステートメントと、もしあればインデックスに関する ステートメントを表示します。以下の例をご覧下さい:

sqlite> .schema
create table tbl1(one varchar(10), two smallint)
CREATE TABLE tbl2 (
f1 varchar(30) primary key,
f2 text,
f3 real
)
sqlite> .schema tbl2
CREATE TABLE tbl2 (
f1 varchar(30) primary key,
f2 text,
f3 real
)
sqlite>

".schema" コマンドは、list モードで以下のクエリーを発行することと 同じです:

SELECT sql FROM 
   (SELECT * FROM sqlite_master UNION ALL
    SELECT * FROM sqlite_temp_master)
WHERE type!='meta'
ORDER BY tbl_name, type DESC, name

ひとつのテーブルに関するスキーマだけを見たい場合には ".schema" に引数を与えますが、その場合のクエリーは以下のようになります:

SELECT sql FROM
   (SELECT * FROM sqlite_master UNION ALL
    SELECT * FROM sqlite_temp_master)
WHERE tbl_name LIKE '%s' AND type!='meta'
ORDER BY type DESC, name

上記のクエリーにおいて、%s はご想像の通り ".schema" の引数で 置き換えられます。".schema" コマンドへの引数は SQL の LIKE 演算子に 現れることに注意してください。つまり、テーブル名にはワイルドカードを 使うことができます。たとえば、名前の中に "abc" という文字列を含む すべてのテーブルのスキーマを得るには以下のように指定します:

sqlite> .schema %abc%

同様に、".table" コマンドでも第一引数にパターンを指定できます。 .table コマンドに引数を指定した場合、その前後に "%" 文字が付加され、 さらにクエリーに LIKE 句が追加されます。これにより、特定のパターン にマッチするテーブルの一覧を表示できるのです。

".databases" コマンドは現在のコネクションでオープンされているすべての データベースを表示します。これは少なくとも 2 個表示されます。 最初のものは "main" で、オープンされたオリジナルのデータベースです。 2 番目のものは "temp" で、一時テーブルのための使われるデータベースです。 ATTACH ステートメントで接続されたデータベースに関する追加データベース が表示される場合もあります。最初の出力カラムは接続されている データベースの名前、次のカラムは外部ファイル名の名前です。

sqlite> .databases

データベース全体を ASCII テキストファイルに変換する

データベースの中身全部を一つの ASCII テキストファイルに変換するには ".dump" コマンドを使います。このファイルをパイプで sqlite に流し込むことで、元のデータベースを復元することができます。

データベースのアーカイブコピーを作るには、以下のようにします:

$ echo '.dump' | sqlite ex1 | gzip -c >ex1.dump.gz

これにより ex1.dump.gz という名前のファイルが作られます。 これには後にデータベースを再構築するためのすべての情報が含まれています。 データベースを再構築するには、単にこのように入力するだけです:

$ zcat ex1.dump.gz | sqlite ex2

ここで使われているテキストフォーマットは PostgreSQL で使われているものと同じなので、.dump コマンドを使うと SQLite データベースを エクスポートして、そのまま PostgreSQL データベースにインポートできます。 次のような感じです:

$ createdb ex2
$ echo '.dump' | sqlite ex1 | psql ex2

pg_dump ユーティリティを使うと、PostgreSQL のデータベースを エクスポートして、(完全ではないですが)ほぼそのまま SQLite に 取り込むことができます。残念なことに、pg_dump がデータベース スキーマの情報を書き出す際に使われる SQL 文法のうち、SQLite が解釈できないものが一部あります。このため pg_dump の出力を 直接 sqlite にパイプでつなぐことはできません。ただし、 スキーマを別途再生成しておき、pg_dump-a オプション 付きで動かすことで PostgreSQL データベースのデータだけを取り出し、 これを SQLite に直接流し込むことはできます。

$ sqlite ex3 <schema.sql
$ pg_dump -a ex2 | sqlite ex3

その他のドットコマンド

".explain" ドットコマンドはまず "column" モードにし、次に EXPLAIN コマンドの出力を見る際に見やすいようなカラム幅にセットしてくれます。 EXPLAIN コマンドは SQLite 独自の SQL 拡張機能で、デバッグの際に 有用なものです。なんらかの普通の SQL コマンドの前に EXPLAIN を付けると、 その SQL コマンドはパースされ解析されますが、実行はされません。 その代わり、その SQL コマンドを実行する際に使われるべき仮想マシン用の 命令シーケンスを、クエリー結果のようにして表示します。 以下のような感じです:


sqlite> .explain
sqlite> explain delete from tbl1 where two<20; addr opcode p1 p2 p3 ---- ------------ ----- ----- ------------------------------------- 0 ListOpen 0 0 1 Open 0 1 tbl1 2 Next 0 9 3 Field 0 1 4 Integer 20 0 5 Ge 0 2 6 Key 0 0 7 ListWrite 0 0 8 Goto 0 2 9 Noop 0 0 10 ListRewind 0 0 11 ListRead 0 14 12 Delete 0 0 13 Goto 0 11 14 ListClose 0 0

".timeout" コマンドは、sqlite がアクセスを試みるファイルに関し、 エラーを返すまでにロックを待つ時間をセットします。 タイムアウト値のデフォルト値は 0 で、 これは必要なデータベーステーブルまたはインデックスがロックされている場合、 即時にエラーを返すことを示します。

そして最後に残ったのが、sqlite コマンドを終了させる ".exit" コマンドです。

シェルスクリプト内で sqlite を使う

シェルスクリプトの中で sqlite を使う方法の一つは、 まず "echo" や "cat" でコマンドシーケンスをファイルに書き出しておき、 生成されたコマンドファイルを入力ファイルとしてリダイレクトで sqlite に流し込んでやるというやり方です。これは正しく動きますし、 多くの状況において適切なやり方です。しかしながら、別の便利な使い方として、 sqlite にデータベース名の次の引数として一個の SQL コマンドを 渡してやることができます。sqlite プログラムが2個の引数を伴って 起動されると、2番目の引数はそのまま SQLite ライブラリに渡されて処理され、 クエリー結果が list モードで標準出力に出力され、プログラムは終了します。 このメカニズムは sqlite を "awk" のようなプログラムと組み合わせる際に 使いやすいように考えてデザインされました。例を見てください:

$ sqlite ex1 'select * from tbl1' |
> awk '{printf "<tr><td>%s<td>%s\n",$1,$2 }'
<tr><td>hello<td>10
<tr><td>goodbye<td>20
$

シェルコマンドを終了する

SQLite のコマンドは通常はセミコロンで終了します。シェルの中では、 これに加えて "GO" という単語(大文字小文字を区別しません)または バックスラッシュ文字 "\" だけの行をコマンドの終了として使えます。 シェルはこれらを関数に渡す前にセミコロンに変えるため、これらは sqlite_exec() では使えません。

sqlite プログラムをソースからコンパイルする

sqlite プログラムは sqlite ライブラリをコンパイルする際に自動的に 作られます。単にソースツリーのコピーを取得し、"configure" と "make" を動かしてください。


SQLite のホームページに戻る