SQLiteのコマンド

簡単にDBを構築したい場合に超便利なSQLite
しかし趣味で偶にしか使わないので、毎回コマンドを忘れてしまうため備忘録として。

データベース系

データベースを作る or 接続する
sqlite dbname

dbnameのファイルが存在しなかった場合は新規に作成され、既に存在する場合はそのDBに接続する。

データベースの名前を見る
sqlite> .databases
seq  name             file
---  ---------------  ----------------------------------------------------------
0    main             /home/sqlite/sample.db
sqlite> .exit

現在接続中のDB(ファイル)のパスが表示される。

データベースの接続を切る
sqlite> .exit

又は、

sqlite> .quit
データベースのバックアップ

sqliteはデータベース毎にファイルが作成される為、そのファイルをコピーするだけでもバックアップが取れる。
.backupと.restoreコマンドを使う方法もある。

table系

tableの一覧を表示する
sqlite> .tables
sample1
sample2
tableのインデックス一覧を表示する
sqlite> .indices sample
name_index
tableのスキーマを確認する
sqlite> select * from sqlite_master; #*はテーブル名

下記の場合はCREATE TABLE文のみ表示される

sqlite> .schema [TABLE]

ダンプ&リストア系

ddl文まで含んだSQLとして出力される。

ダンプコマンド
sqlite> .dump [tablename, ...] > dump.sql

tablenameは複数指定可能。指定しなかった場合は全てダンプされる。

コマンドラインからのダンプ
sqlite dbname .dump > dump.sql
リストアコマンド
sqlite> .read dump.sql
コマンドラインからのリストア
sqlite dbname < dump.sql

ファイルの入力&出力系

表示結果をファイルに出力する
sqlite> .output sample.txt  #sample.txtは任意
sqlite> select * from sample;
sqlite>

これでsample.txtに表示結果が出力されている。尚、出力されるフォーマットは設定値の通りになる。
つまり以下のような設定にすると、簡単なcsv形式での出力が可能となる。(エスケープ等の処理はされない)
.mode csvで出力した場合はエスケープ処理もされるが、そのままインポートが出来ないので注意が必要。

sqlite> .output sample.csv
sqlite> .separator ","
sqlite> select * from sample;
ファイルからデータをインポートする
sqlite> .import sample.txt sample  #.import ファイル名 table名

ただし、区切り文字が設定値と一致しなければならない。

出力設定系

現在の設定値を表示する
sqlite> .show
     echo: off
  explain: off
  headers: off
     mode: list
nullvalue: ""
   output: stdout
separator: "|"
    width:

各項目は以下のコマンドで変更できる

実行したSQLを復唱する

OFFの場合(通常)

sqlite> .echo OFF
sqlite> select * from sample;

ONの場合

sqlite> .echo ON
sqlite> select * from sample;
select * from sample; #復唱されている
explainの結果を見やすくする

OFFの場合(通常)

sqlite> .explain OFF
sqlite> explain select * from sample;
0|Goto|0|13|
1|Integer|0|0|
2|OpenRead|0|2|
...

ONの場合

sqlite> .explain ON
sqlite> explain select * from sample;
addr  opcode          p1          p2          p3
----  --------------  ----------  ----------  ---------------------------------
0     Goto            0           13
1     Integer         0           0
2     OpenRead        0           2
...

.explain ON後は、headers: on、headers: onになっている為、通常のSELECT結果も同様の表示結果となる

SELECT結果でテーブルのヘッダーを表示する

ONの場合

sqlite> .header ON
sqlite> select * from sample;
id|user|type|name #これがヘッダー
1|root|A|vaice
2|dbuser|B|tanaka

OFF(通常)の場合

sqlite> .header OFF
sqlite> select * from sample;
select * from sample;
1|root|A|vaice
2|dbuser|B|tanaka
SELECT結果のフォーマットを変更する
sqlite> .mode [MODE]

[MODE]の種類は以下

MODE 説明
csv CSV形式
column 幅の揃ったテーブル形式で表示される
html TRタグ、TDタグを使ったHTMLのテーブルとして表示される
insert INSERT文で表示される
line clumn名 = value値 のペアで1行ずつ表示される
list デフォルト値。separatorの値で左詰で表示される
tabs タブ区切りで表示される
tcl tcl文法で表示される
表示結果の出力先を変更する

ファイルに出力する

sqlite> .output sample.txt  #sample.txtは任意
sqlite> select * from sample;
sqlite>

詳しくは「表示結果をファイルに出力する」の項目を参照。
標準出力に戻す場合は以下。

sqlite> .output stdout
データがnullだった場合の表示を指定する
sqlite> .nullvalue "NULL" #デフォルトは""(空)
データの区切り文字を指定する
sqlite> .separator "," #デフォルトは"|"
カラムの横幅を指定する

modeがcolumnの時のみ有効。

sqlite> .width "10" #デフォルトは""

スペース区切りで左から順に指定可能。

sqlite> .width "5 5 10 10"