SQLite を Linux のコマンドラインで使う

仕事で SQLite を久しぶりに使うことにしたので調べた。
あまり環境をいじりたくないサーバに新規にツールを作って乗せようとしたときに、DB があればうれしいなーと思ったら SQLite が入っていたので使うことにしたという経緯。
今回は sqlite プロンプトではなく Linux ターミナルのコマンドラインで使いたい。
mysql が -e コマンドで SQL を実行できるようなイメージね。


使うバージョン は3.3.6。

$ sqlite3 -version
3.3.6

古いが気にしない。


で、こんなテーブルをこさえました。馬ですね。

CREATE TABLE horses (
    id          INTEGER NOT NULL PRIMARY KEY,
    name        TEXT    NOT NULL UNIQUE,
    birthday    TEXT,
    description TEXT
); 

SQLite の場合、利用できるデータ型は「TEXT」「NUMERIC」「INTEGER」「REAL」「NONE」の5つしかない。
birthday のデータ型が DATETIME とかの日付関連じゃないのはそのため。
仮に DATETIME を指定しても問題はたぶん無いが、内部的には TEXT 型に変換されて格納されている。
自分の好みでどっちを指定してもいーんじゃね?


さて本題。
これまでは sqlite プロンプトでのみ使うことが多かった。例えばこんな感じで。

$ sqlite3 test.db
SQLite version 3.3.6
Enter ".help" for instructions
sqlite> .header on
sqlite> .mode column
sqlite> select * from horses where id = 1;
id          name                         birthday    description
----------  ---------------------------  ----------  -----------------------
1           エルコンドルパサー           1995-03-17  1999年 年度代表馬

これをコマンドラインからできるようにしたいわけ。


まずは SQL の実行。
これは簡単。sqlite3 コマンドに続けて打てばいい。

$ sqlite3 horses.db "select * from horses where id = 1"
1|エルコンドルパサー|1995-03-17|1999年 年度代表馬


あとはオプション。
sqlite3 プロンプトで .(ドット)で始まるコマンド(メタコマンド)はオプションで代替できる(と思う)。
上の例なら .header on は -header、.mode column は -column になる。

$ sqlite3 -header -column horses.db "select * from horses where id = 1"
id          name                         birthday    description            
----------  ---------------------------  ----------  -----------------------
1           エルコンドルパサー           1995-03-17  1999年 年度代表馬

column 以外でも .mode で指定できるものならある程度対応している。デフォルトは -list


html なら -html

$ sqlite3 -header -html horses.db "select * from horses where id = 1"
<TR><TH>id</TH><TH>name</TH><TH>birthday</TH><TH>description</TH></TR>
<TR><TD>1</TD>
<TD>エルコンドルパサー</TD>
<TD>1995-03-17</TD>
<TD>1999年 年度代表馬</TD>
</TR>

実際に Web ページに貼り付けるとこんな感じ。

idnamebirthdaydescription
1 エルコンドルパサー 1995-03-17 1999年 年度代表馬


line なら -line

$ sqlite3 -line horses.db "select * from horses where id = 1"
         id = 1
       name = エルコンドルパサー
   birthday = 1995-03-17
description = 1999年 年度代表馬


ただし、.mode csv や .mode tabs はあるが -csv とか -tabs というオプションはない。
なので代わりに -separator でセパレータを指定してあげるといい。


.mode csv の代わりに -separator , を指定。

$ sqlite3 -header -separator , horses.db "select * from horses where id = 1"
id,name,birthday,description
1,エルコンドルパサー,1995-03-17,1999年 年度代表馬


.mode tabs の代わりに -separator $'\t' を指定。

$ sqlite3 -header -separator $'\t' horses.db "select * from horses where id = 1"
id      name    birthday        description
1       エルコンドルパサー      1995-03-17      1999年 年度代表馬

タブの指定は $'\t' としないといけない。
普通に Tab キーを押すと補完が効いてしまうし、'\t' とするとセパレータは \t という文字列になってしまう。すこし面倒。


だいたいこんなところ。
まだ他にもオプションはあるんだけど自分はこれだけ使えれば十分なので必要になったときにまた調べようと思う。
-init とか -nullvalue とかそのうち必要になりそう。


ぶっちゃけるとこの記事の内容は $ man sqlite3 で全部見れます。