SQLite3 Command Line Shell dot-commands マニュアル(完全版)

# はじめに

職場の後輩から「SQLite3 "dot commands" が知らない間に増えているんですが・・・」と教えてもらって、ちょっと調べたら、SQLite3 から Excel が呼び出せたりと有用なコマンドが増えていますので、使い方をまとめてみました。

:::note info
(2024/8/11 更新)
投稿から3年以上が経過して、SQLite3が 3.31.1 から 3.46.0 にバージョンアップされて、追加された"dot commands"もありましたので内容を見直しました。
:::

OSS データベースの SQLite は、ユーザが SQLite データベースで SQL ステートメントを入力し実行することを可能にするsqlite3(Windowsでは sqlite3.exe)という名前の Command Line Shell プログラム(以下、CLI)を提供しています。Oracle の SQL*Plus や PostgreSQL の psql に相当します。

この CLI は、通常、入力された SQL ステートメントを実行しますが、"." で始まる "dot commands" と呼ばれる特別なコマンドがあります。 

この "dot commands" は、SQLite3 がリリースされた当初、22だったコマンドが、なんと最新バージョンでは 60 以上のコマンドが存在します。SQLite本家の [Command Line Shell For SQLite](https://www.sqlite.org/cli.html) というページでコマンドの説明がされていますが、最新ではなく、すべて紹介されている訳ではないと思われます。また、Qiitaをはじめ すべてに解説した資料が見つかりませんでしたので、ここではデフォルトのコンパイルで使える、すべてのコマンドの使い方についてまとめています。

使用した SQLite3 のバージョンは 3.46.0 です。

# dot-commands 一覧

dot-commands　をクリックしますと詳細な説明へ移動します。

|コマンド名  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|説明|
|:---|:---|
|[.archive](#archive-アーカイブ管理) ...|アーカイブを管理|
|[.auth] ON &#124; OFF|authorizer コールバックの表示。通常ビルドでは使用不可|
|[.backup](#backup-バックアップ) ?DB? FILE|データベース(デフォルトは "main")をファイルにバックアップ|
|[.bail](#bail-エラー発生時の停止制御) on &#124; off|エラー発生時の停止を制御 (デフォルトは OFF)|
|[.binary](#binary-ファイル出力モードの設定) on &#124; off|ファイル出力モードを設定 (デフォルトは OFF)|
|[.cd](#cd-作業ディレクトリの変更) DIRECTORY|作業ディレクトリを変更|
|[.changes](#changes-更新レコード数の表示制御) on &#124; off|SQLによる更新レコード数の表示を制御|
|[.check](#check-テスト結果のチェック) GLOB|テスト結果をGLOB形式の文字列でチェック|
|[.clone](#clone-クローンdbの作成) NEWDB|クローンデータベースを作成|
|[.connection](#connection-複数のデータベース接続) CLOSE #|複数のデータベース接続のオープンとクローズ|
|[.crnl](#crnl-改行変更)  on &#124; off|\n を \r\n に変換|
|[.databases](#databases-db一覧の表示)|データベース一覧を表示|
|[.dbconfig](#dbconfig-db設定の表示設定) ?op? ?val?|データベース設定を表示または設定|
|[.dbinfo](#dbinfo-db情報の表示) ?DB?|データベース情報を表示|
|[.dump](#dump-dbを構成するsqlの表示) ?TABLE? ...|データベースを構成するSQLを表示|
|[.echo](#echo-エコー表示の制御) on &#124; off|エコー表示を制御|
|[.eqp](#eqp-自動-explane-query-plan) on &#124; off &#124; full &#124; ...|EXPLANE QUERY PLAN を自動で実行する機能を制御|
|[.excel](#excel-excel出力)|SQLを実行後にExcelを起動して出力|
|[.exit](#exit-sqlite3コマンドの終了) ?CODE?|リターンコードを付与して、sqlite3 CLIを終了|
|[.expert](#expert-インデックス作成の提案)|クエリ向けインデックス作成の提案|
|[.explain](#explain-フォーマットモードの設定) ?on &#124; off &#124; auto?|EXPLAIN フォーマットモードを設定 (デフォルトは auto)|
|[.filectrl](#filectr-sqlite3_file_control) CMD ...|さまざまなsqlite3_file_control()オペレーションを実行|
|[.fullschema](#fullschema-スキーマとstatテーブルの表示) ?--indent?|スキーマとSTATテーブルを表示|
|[.headers](#header-ヘッダー表示の制御) on &#124; off|ヘッダー表示を制御|
|[.help](#help-ヘルプの表示) ?-all? ?PATTERN?|ヘルプを表示|
|[.import](#import-データのインポート) FILE TABLE|ファイルからテーブルにデータをインポート|
|[.imposter](#imposter-imposterテーブルの作成) INDEX TABLE|imposter テーブルを作成|
|[.indexes](#indexes-インデックス一覧の表示) ?TABLE?|インデックス一覧を表示|
|[.limit](#limit-制限値sqlite_limitの表示設定) ?LIMIT? ?VAL?|SQLITE_LIMIT の制限値を表示または設定|
|[.lint](#lint-潜在的なスキーマ問題点のレポート) OPTIONS|潜在的なスキーマ問題点をレポート|
|[.load](#load-拡張ライブラリのロード) FILE ?ENTRY?|拡張ライブラリをロード|
|[.log](#log-ログ出力の制御) FILE &#124; off|ログ出力を制御|
|[.mode](#mode-フォーマットモードの設定) MODE ?TABLE?|フォーマットモードを設定|
|[.nullvalue](#nullvalue-null出力文字列の設定) STRING|NULL値の代替文字列の設定をします。|
|[.once](#once-sqlコマンドのファイルへ出力) (-e &#124; -x &#124; FILE)|SQL実行後、ファイルに出力|
|[.open](#open-dbオープン) ?OPTIONS? ?FILE?|データベースをオープン|
|[.output](#output-出力ファイルの指定) ?FILE?|出力ファイルを指定|
|[.parameter](#parameter-sqlパラメータバインディングの管理) CMD ...|SQLパラメータ・バインディングを管理|
|[.print](#print-文字列の表示) STRING...|文字列を表示|
|[.progress](#progress-opcode進捗状況表示の設定) N|opcode 進捗状況表示を設定|
|[.prompt](#prompt-プロンプト表示の変更) MAIN CONTINUE|プロンプト表示を変更|
|[.quit](#quit-sqlite3の終了)|sqlite3 CLI を終|
|[.read](#read-sqlファイルの読み込み実行) FILE|SQLファイルを読み込みで実行|
|[.recover](#recover-リカバリー)|データベースを修復|
|[.restore](#restore-リストア) ?DB? FILE|データベースを復元 (デフォルトは "main")|
|[.save](#save-インメモリデータベースの保存) FILE|インメモリデータベースをファイルに保存|
|[.scanstats](#scanstats-sqlite3_stmt_scanstatus) on &#124; off|sqlite3_stmt_scanstatus() メトリックの設定。通常ビルドでは使用不可|
|[.schema](#schema-スキーマの表示) ?PATTERN?|スキーマを表示|
|[.selftest](#selftest-セルフテストの実行) ?OPTIONS?|selftest テーブルの中に定義されたセルフテストを実行|
|[.separator](#separator-区切り文字の指定) COL ?ROW?|区切り文字を指定|
|[.sha3sum](#sha3sum-sha3ハッシュ値の表示) ...|SHA3ハッシュ値を表示|
|[.shell](#shell-外部コマンドを実行) CMD ARGS...|外部コマンドを実行|
|[.show](#show-設定値の表示)|設定値を表示|
|[.stats](#stats-ステータス表示の制御) ?on &#124; off?|ステータス表示を制御|
|[.system](#system-システムコマンドの実行) CMD ARGS...|システムコマンドを実行|
|[.tables](#tables-テーブルの一覧表示) ?TABLE?|テーブルの一覧を表示|
|[.testcase](#testcase-testcase-outtxt出力) NAME|testcase-out.txtに出力|
|[.testctrl](#testctrl-sqlite3_test_control) CMD ...|さまざまな sqlite3_test_control() オペレーションを実行|
|[.timeout](#timeout-タイムアウト時間の設定) MS|タイムアウト時間を設定|
|[.timer](#timer-タイマーの設定) on &#124; off|SQL文の実行時間を測定するタイマーを設定|
|[.trace](#trace-トレースの設定) ?OPTIONS?|実行したSQL文をトレースを設定|
|[.version](#version-バージョン表示) |ソースコード、ライブラリ、コンパイラのバージョン表示|
|[.vfsinfo](#vfsinfo-最上位vfsの情報表示) ?AUX?|最上位 VFS の情報を表示|
|[.vfslist](#vfslist-vfsの一覧表示)|VFS の一覧を表示|
|[.vfsname](#vfsname-vfsスタック名の出力) ?AUX?|VFS スタック名を出力|
|[.width](#width-カラム幅の設定) NUM1 NUM2 ...|カラム幅を設定|

# SQLite3 での事前準備

ここで書かれている "dot commands" の使い方について確認するために、以下の SQL を CLI で実行して、テーブルとデータを作成して下さい。

```sql
$ sqlite3
sqlite> CREATE TABLE emp(
   ...>   id        INTEGER PRIMARY KEY,
   ...>   name1     TEXT,
   ...>   name2     TEXT );
sqlite> INSERT INTO emp(id, name1, name2) VALUES (1, "Toshiba", "Taro");
sqlite> INSERT INTO emp(id, name1, name2) VALUES (2, "Kannai", "Jiro");
sqlite> INSERT INTO emp(id, name1, name2) VALUES (3, "Mishima", "Saburo");
```

# .archive (アーカイブ管理)

SQLite アーカイブ・フォーマットをサポートします。(.archive , .ar)<br>
このコマンドは、unixシステムの tar コマンドに似ています。以下のコマンドが可能です。

```
sqlite> .ar -cf ARCHIVE count.sql
sqlite> .shell ls -l AR*
-rw-r--r--. 1 sqlite sqlite 1536  4月 14 20:51 ARCHIVE
sqlite> .ar -tf ARCHIVE
count.sql
```

# .backup (バックアップ)

オープンしているメインデータベースのバックアップを行います。(.backup , .bac)

```bash
sqlite> .backup backup1.db
sqlite> .shell ls -l back*
-rw-r--r--. 1 sqlite sqlite 8192  3月 14 18:58 backup1.db
```

# .bail (エラー発生時の停止制御)

エラーが起きた際に停止するかどうか ON, OFF で制御します。(.bail, .bai)<br>
ON の場合、エラーが起きた時点で、処理を停止します(デフォルトは OFF)。バッチ処理などで効果があると思います。

```sql
[sqlite@localhost work]$ cat error.sql 
SELECT count() FROM emp;
SELE;
SELECT * FROM emp WHERE id=2;
[sqite@localhost work]$ sqlite3 test1.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .read count.sql
3
Error: near line 2: near "SELE": syntax error
2|Kannai|Jiro
sqlite> .bail on
sqlite> .read count.sql
3
Error: near line 2: near "SELE": syntax error
```

例では、SQLファイルは2行目でエラーが発生するようにしています。<br>
デフォルトの場合、エラー発生後、3行目のSQLが実行されます.bail on で設定した場合、エラー発生後、処理が停止されて3行目のSQLが実行されません。

# .binary (ファイル出力モードの設定)

ファイル出力をバイナリモードにするかどうかを ON, OFF で設定します。(.binary , .bin)<br>
ON の場合、ファイル出力をバイナリモードにします(デフォルトは OFF)。Windowsだけ対応しています。

```sql
sqlite> SELECT * FROM emp;
sqlite> .output binary.log
sqlite> .binary on
sqlite> SELECT * FROM emp;
```

# .cd (作業ディレクトリの変更)

作業ディレクトリを変更します。(.cd)

```
sqlite> .cd ..
```

# .changes (更新レコード数の表示制御)

更新レコード数の表示制御を ON, OFF で行います。(.changes , .cha)

```sql
sqlite> .changes on
sqlite> UPDATE emp SET name1='Kitajima' WHERE id=3;
changes:   1   total_changes: 1
```

# .check (テスト結果のチェック)

.testcase の出力が オプションで指定したGLOB形式の文字列と一致しない場合、FAILEDとします。(.check , .che)

```bash
sqlite> .shell cat testcase-out.txt
0 errors out of 1 tests
sqlite> .check "0*"
testcase-? ok
sqlite> .check "1*"
testcase-? FAILED
 Expected: [1*]
      Got: [0 errors out of 1 tests
]
```

# .clone (クローンDBの作成)

新しいデータベースファイル名を指定して、クローンデータベースを作成します。(.clone , .c)

```bash
sqlite> .clone test3.db
emp... done
sqlite> .shell ls -l test3*
-rw-r--r--. 1 sqlite sqlite 8192  3月 14 21:33 test3.db
```
# .connection (複数のデータベース接続)

複数のデータベース接続をオープンまたはクローズします。(.connection, .conn)
.connコマンドの後に番号を入力することで、存在しない場合は新たに作成して別のデータベース接続に切り替えることができます。データベース接続を閉じるには、「.conn close N」と入力します(Nは接続番号)。

```sql
sqlite> .database
main: /home/sqlite/work/test1.db r/w
sqlite> .conn 1
sqlite> .database
main: "" r/w
sqlite> .open test4.db
sqlite> .database
main: /home/sqlite/work/test4.db r/w
sqlite> .conn close 1
cannot close the active database connection
sqlite> .conn close 0
sqlite> 
```

# .crnl (改行変更)
改行を \n (LF) を \r\n (CR+LF) に変換します。(.crnl)
デフォルトは ON で設定されています。

```
sqlite> .crnl off
```

# .databases (DB一覧の表示)

データベース一覧を表示します。(.databases , .dat)
データベースをATTACHしている場合に役に立ちます。

```bash
sqlite> .databases
main: /home/sqlite/work/test1.db
```

# .dbconfig (DB設定の表示・設定)

sqlite3_db_config() で設定できるオプションを表示、設定を行います。(.dbconfig ,  .dbc)

```
sqlite> .dbconfig
          defensive off
            dqs_ddl on
            dqs_dml on
        enable_fkey off
        enable_qpsg off
     enable_trigger on
        enable_view on
     fts3_tokenizer off
 legacy_alter_table off
 legacy_file_format off
     load_extension on
   no_ckpt_on_close off
     reset_database off
        trigger_eqp off
     trusted_schema on
    writable_schema on
```

オプションを設定する場合、オプション名と値を引数として与えます。

```
sqlite> .dbc load_extension off
     load_extension off
```

# .dbinfo (DB情報の表示)

データベースの情報(ページサイズなど)を表示します。(.dbinfo , .dbi)
データベース名を指定しますと指定されたデータベースの譲歩を表示します。

```
sqlite> .dbinfo
database page size:  4096
write format:        1
read format:         1
reserved bytes:      0
file change counter: 2
database page count: 2
freelist page count: 0
schema cookie:       1
schema format:       4
default cache size:  0
autovacuum top root: 0
incremental vacuum:  0
text encoding:       1 (utf8)
user version:        0
application id:      0
software version:    3031001
number of tables:    1
number of indexes:   0
number of triggers:  0
number of views:     0
schema size:         81
data version         2
```

# .dump (DBを構成するSQLの表示)

データベースを構成する全てのSQLを表示します。(.dump , .d)
テーブル名を指定することで、そのテーブルを構成する全てのSQLを表示します。

```sql
sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE emp(
id        INTEGER PRIMARY KEY,
name1     TEXT,
name2     TEXT );
INSERT INTO emp VALUES(1,'Toshiba','Taro');
INSERT INTO emp VALUES(2,'Kannai','Jiro');
INSERT INTO emp VALUES(3,'Mishima','Saburo');
COMMIT;
```

# .echo (エコー表示の制御)

エコー表示を ON, OFF で制御します。(.echo , .e)

```sql
sqlite> .echo on
sqlite> SELECT * FROM emp;
SELECT * FROM emp;
1|Toshiba|Taro
2|Kannai|Jiro
3|Mishima|Saburo
```

# .eqp (自動 EXPLANE QUERY PLAN)

クエリ実行前に、EXPLANE QUERY PLAN を自動で実行する機能の制御を ON, OFF, FULL, TRIGGER で制御します。(.eqp) <br>
FULL : EXPLANE 詳細表示を自動的に実行させます。<br>
TRIGGER : FUUL + TRIGGER のバイトコードを表示します。<br>

```sql
sqlite> .mode column
sqlite> .eqp full
sqlite> SELECT * FROM emp;
QUERY PLAN
`--SCAN TABLE emp
addr  opcode         p1    p2    p3    p4             p5  comment      
----  -------------  ----  ----  ----  -------------  --  -------------
0     Init           0     9     0                    00  Start at 9   
1     OpenRead       0     2     0     3              00  root=2 iDb=0; emp
2     Rewind         0     8     0                    00               
3       Rowid          0     1     0                    00  r[1]=rowid   
4       Column         0     1     2                    00  r[2]=emp.name1
5       Column         0     2     3                    00  r[3]=emp.name2
6       ResultRow      1     3     0                    00  output=r[1..3]
7     Next           0     3     0                    01               
8     Halt           0     0     0                    00               
9     Transaction    0     0     1     1              01  usesStmtJournal=0
10    Goto           0     1     0                    00               
1     Toshiba        Taro
2     Kannai         Jiro
3     Mishima        Sabu
```

# .excel (Excel出力)

.excel コマンドの後、次のSQLを実行後にExcelを起動して出力します。(.excel)

```sql
sqlite> .excel
sqlite> SELECT * FROM emp;
```

![sqlite_excel.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308856/da367e2f-aff7-9fdd-3de2-f9a05455ffde.jpeg)

# .exit (sqlite3コマンドの終了)

リターンコードを付けて、sqlite3 シェルツールを終了します。(.exit , .ex)

```
sqlite> .exit 1
[sqlite@localhost work]$ 
```

# .expert (インデックス作成の提案)

実行したクエリに対して、インデックス作成を提案します。(.expert , exp)

```sql
sqlite> .expert
sqlite> SELECT * FROM emp WHERE name2='jiro';
CREATE INDEX emp_idx_000c3da3 ON emp(name2);

SEARCH TABLE emp USING INDEX emp_idx_000c3da3 (name2=?)
```

# .explain (フォーマットモードの設定)

EXPLAIN フォーマットモード を ON, OFF, AUTO で変更できます。(.explain , expl)<BR>
OFF の場合、通常のフォーマットモードで EXPLAIN PLAN の結果が表示されます。

```
sqlite> .explain off
sqlite> EXPLAIN SELECT * FROM emp;
0|Init|0|9|0||00|Start at 9
1|OpenRead|0|2|0|3|00|root=2 iDb=0; emp
2|Rewind|0|8|0||00|
3|Rowid|0|1|0||00|r[1]=rowid
4|Column|0|1|2||00|r[2]=emp.name1
5|Column|0|2|3||00|r[3]=emp.name2
6|ResultRow|1|3|0||00|output=r[1..3]
7|Next|0|3|0||01|
8|Halt|0|0|0||00|
9|Transaction|0|0|1|0|01|usesStmtJournal=0
10|Goto|0|1|0||00|
```

# .filectr (sqlite3_file_control)

さまざまなsqlite3_file_control()オペレーションを実行します。

```
sqlite> .filectr
Available file-controls:
  .filectrl size_limit [LIMIT]
  .filectrl chunk_size SIZE
  .filectrl persist_wal [BOOLEAN]
  .filectrl psow [BOOLEAN]
  .filectrl tempfilename 
  .filectrl has_moved 
  .filectrl lock_timeout MILLISEC
```

# .fullschema (スキーマとSTATテーブルの表示)

データベース・スキーマと sqlite_stat テーブルを表示します。(.fullschema , .f)<br>
sqlite_stat テーブル "sqlite_stat1", "sqlite_stat3", "sqlite_stat4" が存在すれば、その情報を表示します。

```sql
sqlite> .fullschema
CREATE TABLE emp(
id        INTEGER PRIMARY KEY,
name1     TEXT,
name2     TEXT );
/* No STAT tables available */
```

# .headers (ヘッダー表示の制御)

クエリ結果を表示する際、ヘッダーを表示するか ON, OFFで制御します(デフォルトはOFF)。(.headers , .h)

```sql
sqlite> .headers on
sqlite> SELECT * FROM emp WHERE id=2;
id|name1|name2
2|Kannai|Jiro
```

# .help (ヘルプの表示)

ドット・コマンドのヘルプを表示します。(.help , .h)
コマンドを指定することで詳細を表示することができます。

```
sqlite> .help .testcase
.check GLOB              Fail if output since .testcase does not match
.testcase NAME           Begin redirecting output to 'testcase-out.txt'
```

# .import (データのインポート)

ファイルからテーブルへのデータをインポートします。(.import , .i)

```sql
sqlite> shell cat test1.csv
1,aaa
2,bbb
sqlite> CREATE TABLE test1(a INTEGER,  b TEXT);
sqlite> .mode csv
sqlite> .import test1.csv test1
sqlite> SELECT * FROM test1;
1,aaa
2,bbb
```

# .imposter (imposterテーブルの作成)

指定されたインデックスから imposter テーブルを作成します。(.imposter , .impos)<br>

```sql
sqlite> .imposter emp_i1 emp2
CREATE TABLE "emp2"("name1","name2","_ROWID_",PRIMARY KEY("name1","name2","_ROWID_"))WITHOUT ROWID;
WARNING: writing to an imposter table will corrupt the "emp_i1" index!
sqlite> SELECT * FROM emp2;
Kannai|Jiro|2
Mishima|Saburo|3
Toshiba|Taro|1
```

imposter テーブルについては以下をご覧下さい。<br>
https://www.sqlite.org/imposter.html

# .indexes (インデックス一覧の表示)

データベースに存在するインデックスを一覧表示します。(.indexes , .in)

```sql
sqlite> CREATE INDEX emp_i1 on emp(name1);
sqlite> .indexes
emp_i1
```

# .limit (制限値(SQLITE_LIMIT)の表示/設定)

SQLITE_LIMIT で設定されているオプションを表示、設定を行います。(.limit)

```
sqlite> .limit
              length 1000000000
          sql_length 1000000000
              column 2000
          expr_depth 1000
     compound_select 500
             vdbe_op 250000000
        function_arg 127
            attached 10
 like_pattern_length 50000
     variable_number 999
       trigger_depth 1000
      worker_threads 0
```

オプションを設定する場合、オプション名と値を引数として与えます。

```
sqlite> .limit column 500
              column 500
```


# .lint (潜在的なスキーマ問題点のレポート)

潜在的なスキーマの問題点をレポートします。(.lint , .lin)

```
sqlite> .lint fkey-indexes
sqlite> 
```

# .load (拡張ライブラリのロード)

sqlite3 で使用できる拡張ライブラリをロードします。(.load , .lo)

```sql
sqlite> SELECT acos(0.1);
Error: no such function: acos
sqlite> .load ./libsqlitefunctions.so
sqlite> SELECT acos(0.1);
1.47062890563334
```

例では、拡張関数の拡張ライブラリを読み込んで、acos関数を使用しています。
拡張関数を詳しくは[SQLite3 で、たった2行追加して拡張ライブラリ(拡張SQL関数)を使おう!](https://qiita.com/kanegoon/items/3221a996429f3c2b0fb8)をご覧下さい。

# .log (ログ出力の制御)

ログ出力の制御を行います。(.log , .l)
ファイル名を指定するとログ出力を開始します。.log off でログ出力を止めます。

```sql
sqlite> .log log.txt            -- ログ出力開始 
sqlite> SELECT * FROM test1;
Error: no such table: test1
sqlite> .log off                -- ログ出力終了
sqlite> SELECT * FROM test2;
Error: no such table: test2
sqlite> .q
[sqlite@localhost work]$ cat log.txt 
(1) no such table: test1 in "SELECT * FROM test1;"
```

例では、ログ出力を停止した後のエラーは出力をされていません。

# .mode (フォーマットモードの設定)

クエリ出力のフォーマットモードを設定します(デフォルトは list)。(.mode , .m)
sqlite3 プログラムでは、8種類("csv", "column", "html", "insert", "line", "list", "quote", "tabs", "tcl")の出力フォーマットが使えます。

**ascii モード**

```sql
sqlite> .mode ascii
sqlite> SELECT * FROM emp WHERE id=1;
1ToshibaTaro
```

**csv モード**

```sql
sqlite> .mode csv
sqlite> SELECT * FROM emp WHERE id=1;
1,Toshiba,Taro
```

**column モード**

```sql
sqlite> .mode column
sqlite> SELECT * FROM emp WHERE id=1;
1           Toshiba     Taro 
```

**html モード**

```
sqlite> .mode html
sqlite> SELECT * FROM emp WHERE id=1;
<TR><TD>1</TD>
<TD>Toshiba</TD>
<TD>Taro</TD>
</TR>
```

**INSERT モード**

```sql
sqlite> .mode insert
sqlite> SELECT * FROM emp WHERE id=1;
INSERT INTO "table" VALUES(1,'Toshiba','Taro');
```

**line モード**

```sql
sqlite> .mode line
sqlite> SELECT * FROM emp WHERE id=1;
   id = 1
name1 = Toshiba
name2 = Taro
```

**list モード**

```sql
sqlite> .mode list
sqlite> SELECT * FROM emp WHERE id=1;
1|Toshiba|Taro
```

**quote モード**

```sql
sqlite> .mode quote
sqlite> SELECT * FROM emp WHERE id=1;
1,'Toshiba','Taro'
```

**tabs モード**

```sql
sqlite> SELECT * FROM emp WHERE id=1;
1	Toshiba	Taro
```

**tcl モード**

```sql
sqlite> .mode tcl
sqlite> SELECT * FROM emp WHERE id=1;
"1" "Toshiba" "Taro"
```

# .nullvalue (NULL出力文字列の設定)

NULL値の代わりに出力する文字列を設定します。(.nullvalue , .n)

```sql
sqlite> INSERT INTO emp(id) VALUES(4);
sqlite> SELECT * FROM emp WHERE id=4;
4||
sqlite> .nullvalue NONE
sqlite> SELECT * FROM emp WHERE id=4;
4|NONE|NONE
```

例では、NULL値の場合、NONE という文字列が表示されます。


# .once (SQLコマンドのファイルへ出力)

1つのSQLコマンドの実行結果をファイルに出力します。(.once , .on)
オプションは以下のとおりです。

```
ファイル名  ファイルに結果を出力します。
-e         Invoke system text editor
-x         スプレッドシートを開きます。
```

```sql
sqlite> .once test1.txt
sqlite> select * from emp;
sqlite> .shell cat test1.txt
1|Toshiba|Taro
2|Kannai|Jiro
3|Mishima|Saburo
```

# .open (DBオープン)

データベースファイルを指定してオープンします。(.open , .op)<br>
.open オプション ファイル名

```
sqlite> .open test2.db
sqlite> .databases
main: /home/sqlite/work/test2.db
```

オプションは以下のとおりです。

```
--append        ファイル終端にデータベースを追加するためにappendvfsを使用
--deserialize   sqlite3_deserialize()を使用して、メモリへロード
--hexdb         インメモリ・データベースとして dbtotxt 出力をロード
--maxsize N     --hexdb　か --deserialize でロードする際の最大サイズ
--new           空データベースとして新規ファイルをオープン
--nofollow      シンボリックリンクの場合、オープンしない
--readonly      読み込み専用でオープン
--zip           ZIPファイルをオープン
```

# .output (出力ファイルの指定)

クエリ結果などを書き出す出力ファイルを指定します。(.output, )

```sql
sqlite> .output output.txt
sqlite> SELECT * FROM emp WHERE id=3;
sqlite> .q
[sqlite@localhost work]$ cat output.txt
3|Mishima|Saburo
```

# .parameter (SQLパラメータ・バインディングの管理)

SQLパラメータ・バインディングの管理を行います。(.parameter , .par)
.parameter CMD ...

```sql
sqlite> .sch temp.sqlite_parameters
sqlite> .parameter init
sqlite> .sch temp.sqlite_parameters
CREATE TABLE temp.sqlite_parameters(
  key TEXT PRIMARY KEY,
  value ANY
) WITHOUT ROWID;
sqlite> .parameter set $var1 2
sqlite> .parameter list
$var1 2
sqlite> SELECT * FROM emp WHERE id = $var1;
2|Kannai|Jiro
```

オプションは以下のとおりです。

```
clear                  全てのバインディングを消去します。
init                   バインディング情報を格納するバインディングテーブル(sqlite_parameters)を作成します。
list                   パラメータバインディング一覧を表示します。
set PARAMETER VALUE    パラメータとその値をセットします。
                       パラメータは $ : @ ?　のどれかから始まる必要があります。
unset PARAMETER        バインディングテーブルからパラメータを削除します。
```

# .print (文字列の表示)

指定された文字列リテラル値を表示します。(.print , .pr)

```
sqlite> .print "Test Statement"
Test Statement
```

# .progress (opcode進捗状況表示の設定)

opcode 進捗状況表示の設定します。(.progress , .pro)
引数 N を指定すると、opcode が N 個、実行される毎に progress を表示します。

```sql
sqlite> .progress 10
sqlite> SELECT * FROM emp;
1|Toshiba|Taro
Progress 1
2|Kannai|Jiro
3|Mishima|Saburo
Progress 2
```

# .prompt (プロンプト表示の変更)

プロンプト表示を変更することができます。(.prompt , .p)

```
<sqlite>.prompt <hello>
<hello>
```

# .quit (sqlite3の終了)

sqlite3 シェルツールを終了します。(.quit , .q)

```
sqlite> .q
[sqlite@localhost work]$ 
```

# .read (SQLファイルの読み込み/実行)

SQLファイルを読み込んで実行します。(.read)

```sql
[sqlite@localhost work]$ cat count.sql 
SELECT count() FROM emp;
SELECT * FROM emp WHERE id=2;
[mototaka@localhost work]$ sqlite3 test1.db
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .read count.sql
3
2|Kannai|Jiro
```

例では、count.sql というSQLファイルを読み込んで実行しています。

# .recover (リカバリー)

データベースが壊れている時に、データベースの修復を試みます。(.recover , .r)

```sql
sqlite> .recover
PRAGMA foreign_keys=OFF;
BEGIN;
PRAGMA writable_schema = on;
CREATE TABLE IF NOT EXISTS  emp(
id        INTEGER PRIMARY KEY,
name1     TEXT,
name2     TEXT );
INSERT INTO "emp"("id", "name1", "name2") VALUES( 1, 'Toshiba', 'Taro' );
INSERT INTO "emp"("id", "name1", "name2") VALUES( 2, 'Kannai', 'Jiro' );
INSERT INTO "emp"("id", "name1", "name2") VALUES( 3, 'Mishima', 'Saburo' );
PRAGMA writable_schema = off;
COMMIT;
```

# .restore (リストア)

バックアップしたファイルからデータベースを復元します。(.restore , .res)

```
sqlite> .restore backup1.db
sqlite> .tab
emp
```

# .save (インメモリデータベースの保存)

インメモリデータベースをファイルに書き出します。(.save , .sav)

```bash
sqlite> .save test1.db
sqlite> .shell ls -l test1*
-rw-r--r--. 1 sqlite sqlite 8192  3月 14 18:32 test1.db
```

# .schema (スキーマの表示)

データベース・スキーマを表示します。(.schema , .sch)
テーブル名を指定することで、そのスキーマを表示します。

```sql
sqlite> .schema emp
CREATE TABLE emp(
id        INTEGER PRIMARY KEY,
name1     TEXT,
name2     TEXT );
```

# .scanstats (sqlite3_stmt_scanstatus)

sqlite3_stmt_scanstatus() メトリックを設定します。通常ビルドでは使用不可となっています。 (.scanstatus, .scan)

```
.screenstats, .s
sqlite> .scan on
Warning: .scanstats not available in this build.
```

# .selftest (セルフテストの実行)

データベースの状態をチェックするために、セルフテストを実行します。(.selftest , .self)<br>
selftest テーブルを作成して、テストケースを INSERT する必要があります。selftest テーブルが存在しない場合、PRAGMA integrity_check を実行してデータベースの状態をチェックします。

```sql
sqlite> .selftest
Missing SELFTEST table - default checks only
0 errors out of 1 tests
sqlite> CREATE TABLE selftest( 
   ...>   tno INTEGER PRIMARY KEY,  -- Test number
   ...>   op  TEXT,                 -- 'run' or 'memo'
   ...>   cmd TEXT,                 -- SQL command to run, or text of "memo"
   ...>   ans TEXT                  -- Expected result of the SQL command
   ...> );
sqlite> INSERT INTO selftest VALUES (1,'run',
   ...> "SELECT count() FROM emp;","3");
sqlite> .self
0 errors out of 1 tests
```

# .separator (区切り文字の指定)

カラム間とレコード間の区切り文字を指定します。(.separator, se)

```sql
sqlite> .separator : :LF\n
sqlite> SELECT * FROM emp WHERE id=3;
3:Mishima:Saburo:LF
```

# .sha3sum (SHA3ハッシュ値の表示)

データベース内容をSHA3ハッシュで計算して表示します。(.sha3sum , .sh3)
この値を比較することで、データベースが更新されているかを確認できます。

```
sqlite> .sha3sum
c05e91c6bb335903337a74c4bead652233566c97873336815aaca245
```

オプションは以下のとおりです。

```
--schema              sqlite_masterテーブルのハッシュ値を計算
--sha3-224            sha3-224 アルゴリズムを使用
--sha3-256            sha3-256 アルゴリズムを使用(デフォルト)
--sha3-384            sha3-384 アルゴリズムを使用
--sha3-512            sha3-512 アルゴリズムを使用
```


# .shell (外部コマンドを実行)

カレントディレクトリで、外部コマンドを実行します。(.shell, .sh)

```bash
sqlite> .shell ls -l
合計 288484
-rw-rw-r--.  1 sqlite sqlite  1670062  2月 10 21:23 SQLite-3.31.1.zip
.....
```

# .show (設定値の表示)

現在、設定されている値を表示します。(.show , .sh)

```
sqlite> .show
        echo: off
         eqp: off
     explain: auto
     headers: off
        mode: list
   nullvalue: ""
      output: stdout
colseparator: "|"
rowseparator: "\n"
       stats: off
       width: 
    filename: :memory:
```

# .stats (ステータス表示の制御)

SQL実行後、ステータスを表示する機能を ON, OFF で制御します。(.stats, .st)<br>
デフォルトは OFF です。

```sql
sqlite> .stats on
sqlite> SELECT * FROM emp WHERE id=2;
2|Kannai|Jiro
Memory Used:                         153736 (max 155064) bytes
Number of Outstanding Allocations:   177 (max 179)
Number of Pcache Overflow Bytes:     4104 (max 4104) bytes
Largest Allocation:                  87200 bytes
Largest Pcache Allocation:           4104 bytes
Lookaside Slots Used:                33 (max 69)
Successful lookaside attempts:       109
Lookaside failures due to size:      0
Lookaside failures due to OOM:       0
Pager Heap Usage:                    13640 bytes
Page cache hits:                     2
Page cache misses:                   2
Page cache writes:                   0
Page cache spills:                   0
Schema Heap Usage:                   2264 bytes
Statement Heap/Lookaside Usage:      5008 bytes
Fullscan Steps:                      0
Sort Operations:                     0
Autoindex Inserts:                   0
Virtual Machine Steps:               11
Reprepare operations:                0
Number of times run:                 1
Memory used by prepared stmt:        5008
Bytes received by read():            33111
Bytes sent to write():               2776
Read() system calls:                 230
Write() system calls:                166
Bytes read from storage:             0
Bytes written to storage:            0
Cancelled write bytes:               0
```

# .system (システムコマンドの実行)

システムコマンドを実行します。(.system , .sy)

```bash
sqlite> .shell ls -l
合計 288484
-rw-rw-r--.  1 sqlite sqlite  1670062  2月 10 21:23 SQLite-3.31.1.zip
.....
```

# .tables (テーブルの一覧表示)

データベースに存在するテーブルを一覧表示します。(.tables , .tab)

```
sqlite> .tables
emp
```

# .testcase (testcase-out.txt出力)

出力を"testcase-out.txt"ファイルへ転送し始めます。
.output コマンドに似ています。

```
sqlite> .testcase
sqlite> .selftest
sqlite> .q
[sqlite@localhost work]$ more testcase-out.txt 
1: Expected: [4]
1:      Got: [3]
1 errors out of 1 tests
```

# .testctrl (sqlite3_test_control)

さまざまな sqlite3_test_control() オペレーションを実行します。 (.testctrl)

```
sqlite> .testctrl
Available test-controls:
  .testctrl always BOOLEAN
  .testctrl assert BOOLEAN
  .testctrl byteorder 
  .testctrl extra_schema_checks BOOLEAN
  .testctrl imposter SCHEMA ON/OFF ROOTPAGE
  .testctrl internal_functions 
  .testctrl localtime_fault BOOLEAN
  .testctrl never_corrupt BOOLEAN
  .testctrl optimizations DISABLE-MASK
  .testctrl pending_byte OFFSET  
  .testctrl prng_restore 
  .testctrl prng_save 
  .testctrl prng_seed SEED ?db?
  .testctrl reserve BYTES-OF-RESERVE
```

# .timeout (タイムアウト時間の設定)

タイムアウト時間をミリ秒で設定します。(.timeout , .timeo)<br>
設定されたタイムアウト時間までロック待ちをします。タイムアウト時間を設定していない場合、ロック待ちしないで即時でエラーを返します。<br>
PRAGMA busy_timeout と同じ働きをします。

```sql
sqlite> .timeout 5000
sqlite> INSERT INTO emp(id) VALUES(5);  -- 他プロセスで test1.db をロックさせています。
Error: database is locked               -- 5秒後にエラーが表示
```

# .timer (タイマーの設定)

SQL文の実行時間を測定するタイマーを ON, OFF で設定します。(.timer)
Linux の time コマンドと同じような動作をします。

```sql
sqlite> .timer on
sqlite> INSERT INTO emp(id) VALUES(4);
Run Time: real 0.006 user 0.000493 sys 0.000000
```

# .trace (トレースの設定)

実行したSQL文をトレースするための設定を行います。(.trace ,　.tr)

```sql
sqlite> .trace trace.txt
sqlite> SELECT count() FROM emp;
4
sqlite> DELETE FROM emp WHERE id=4;
sqlite> .q
[sqlite@localhost work]$ cat trace.txt 
SELECT count() FROM emp;
DELETE FROM emp WHERE id=4;
```

例では、trace.txt ファイルに実行したSQL文を出力しています。
オプションは以下のとおりです。

```
FILE          指定されたファイルに出力
stdout        標準出力に出力
stderr        stderr に出力
off           トレースを停止
--expanded    クエリ・パラメータを拡張
--plain       入力したSQLを出力
--stmt        実行したステートメントをトレース(SQLITE_TRACE_STMT)
--profile     ステートメントを分析 (SQLITE_TRACE_PROFILE)
--row         各レコードを分析 (SQLITE_TRACE_ROW)
--close       トレース接続をクローズ (SQLITE_TRACE_CLOSE)
```

# .version バージョン表示
SQLite3のソースコード、ライブラリ、コンパイラのバージョンを表示します。

```
sqlite> .version
SQLite 3.46.0 2024-05-23 13:25:27 96c92aba00c...........
zlib version 1.3
gcc-13.2.0 (64-bit)
```

# .vfsinfo 最上位VFSの情報表示

最上位の VFS の情報を表示します。(.vfsinfo , .vs)

```sql
sqlite> .vfsinfo
vfs.zName      = "unix"
vfs.iVersion   = 3
vfs.szOsFile   = 120
vfs.mxPathname = 512
```

# .vfslist (VFSの一覧表示)

使用可能な全ての VFS の一覧を表示します。(.vfslist , .vfs)

```
sqlite> .vfslist
vfs.zName      = "unix"  <--- CURRENT
vfs.iVersion   = 3
vfs.szOsFile   = 120
vfs.mxPathname = 512
-----------------------------------
vfs.zName      = "apndvfs"
vfs.iVersion   = 3
vfs.szOsFile   = 144
vfs.mxPathname = 1024
-----------------------------------
vfs.zName      = "memdb"
vfs.iVersion   = 2
vfs.szOsFile   = 120
vfs.mxPathname = 1024
-----------------------------------
vfs.zName      = "unix-excl"
vfs.iVersion   = 3
vfs.szOsFile   = 120
vfs.mxPathname = 512
-----------------------------------
vfs.zName      = "unix-dotfile"
vfs.iVersion   = 3
vfs.szOsFile   = 120
vfs.mxPathname = 512
-----------------------------------
vfs.zName      = "unix-none"
vfs.iVersion   = 3
vfs.szOsFile   = 120
vfs.mxPathname = 512
```

# .vfsname (VFSスタック名の出力)

VFS スタック名を出力します。(.vfsname , .vfsn)

```
sqlite> .vfsname
unix
```

# .width (カラム幅の設定)

column モードのカラム幅を設定します。(.widths , .w)
負数の場合、右寄せで表示します。

```sql
sqlite> .width -2 8 7
sqlite> SELECT * FROM emp;
id  name1     name2  
--  --------  -------
 1  Toshiba   Taro   
 2  Kannai    Jiro   
 3  Mishima   Saburo
```

# まとめ

この "dot commands" は、バージョン毎に改善されて、さまざまコマンドがサポートされています。特にバッチ実行で効果を発揮すると思われ、知っていると自動化に大きな違いが出てくると思います。

もし、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。