2022年4月9日土曜日

SQLite 3 位置を指定して出力結果を改行する(--wrap)

概要

ひとつのカラムに長いテキスト等が入っていると、 コマンドラインツールでは表示が横に伸びて見づらくなってしまう。

.modeコマンドに--wrapオプションを指定することで カラム内のデータを改行させることができる。

--wrapオプションはバージョン3.38.0より利用可能。

構文


.mode <mode_name> --wrap N
                

mode_nameについては以下を参照のこと。

実行例

  1. デフォルトのまま表示する
  2. カラムの幅を10に変更する
  3. カラムの幅を2に変更する
    ヘッダを表示している場合、ヘッダは改行されず見切れてしまうので注意する。
  4. デフォルトのカラム幅に戻す

sqlite> -- # 1.
sqlite> .headers on
sqlite> .mode box
sqlite> select * from sample;
┌──────┬───────────┬──────────────────┐
│  id  │   name    │       mail       │
├──────┼───────────┼──────────────────┤
│ 1111 │ name_1111 │ 1111@example.com │
│ 2222 │ name_2222 │ 2222@example.com │
└──────┴───────────┴──────────────────┘

sqlite> -- # 2.
sqlite> .mode box --wrap 10
sqlite> select * from sample;
┌──────┬───────────┬────────────┐
│  id  │   name    │    mail    │
├──────┼───────────┼────────────┤
│ 1111 │ name_1111 │ 1111@examp │
│      │           │ le.com     │
├──────┼───────────┼────────────┤
│ 2222 │ name_2222 │ 2222@examp │
│      │           │ le.com     │
└──────┴───────────┴────────────┘

sqlite> -- # 3.
sqlite> .mode box --wrap 2
sqlite> select * from sample;
┌────┬────┬────┐
│ id │ na │ ma │
├────┼────┼────┤
│ 11 │ na │ 11 │
│ 11 │ me │ 11 │
│    │ _1 │ @e │
│    │ 11 │ xa │
│    │ 1  │ mp │
│    │    │ le │
│    │    │ .c │
│    │    │ om │
├────┼────┼────┤
│ 22 │ na │ 22 │
│ 22 │ me │ 22 │
│    │ _2 │ @e │
│    │ 22 │ xa │
│    │ 2  │ mp │
│    │    │ le │
│    │    │ .c │
│    │    │ om │
└────┴────┴────┘

sqlite> -- # 4.
sqlite> .mode box
sqlite> select * from sample;
┌──────┬───────────┬──────────────────┐
│  id  │   name    │       mail       │
├──────┼───────────┼──────────────────┤
│ 1111 │ name_1111 │ 1111@example.com │
│ 2222 │ name_2222 │ 2222@example.com │
└──────┴───────────┴──────────────────┘
                
「.width」コマンドと使い分ける

--wrapオプションを使うと全てのカラムの幅が変更されてしまうが、 .width コマンドを使用することでカラム幅を個別にコントロール出来るので、使い分けるとよい。


sqlite> .mode box --wrap 5
sqlite> select * from sample;
┌──────┬───────┬───────┐
│  id  │ name  │ mail  │
├──────┼───────┼───────┤
│ 1111 │ name_ │ 1111@ │
│      │ 1111  │ examp │
│      │       │ le.co │
│      │       │ m     │
├──────┼───────┼───────┤
│ 2222 │ name_ │ 2222@ │
│      │ 2222  │ examp │
│      │       │ le.co │
│      │       │ m     │
└──────┴───────┴───────┘

sqlite> .width 4 5 10
sqlite> select * from sample;
┌──────┬───────┬────────────┐
│  id  │ name  │    mail    │
├──────┼───────┼────────────┤
│ 1111 │ name_ │ 1111@examp │
│      │ 1111  │ le.com     │
├──────┼───────┼────────────┤
│ 2222 │ name_ │ 2222@examp │
│      │ 2222  │ le.com     │
└──────┴───────┴────────────┘
                

日本語はずれてしまう(~ver 3.50.x)

ver 3.50.x 以下のバージョンだと 日本語に限らず幅広の文字は以下の実行例のように見た目が崩れてしまう。


sqlite> .mode box --wrap 5
sqlite> select * from sample;
┌────┬───────┬───────┐
│ id │ name  │ mail  │
├────┼───────┼───────┤
│ 1  │ test_ │ 1111@ │
│    │ 1111  │ examp │
│    │       │ le.co │
│    │       │ m     │
├────┼───────┼───────┤
│ 2  │ 吾輩は猫で │ 2222@ │
│    │ ある。名前 │ examp │
│    │ はまだない │ le.co │
│    │       │ m     │
└────┴───────┴───────┘
                

これは ver 3.51.0 で改善されている。

ただし、--wrapで指定した数字は、 英数字の文字数が基準となり、日本語などはそれに合わせて少ない文字数の箇所で改行される。

以下の場合だと英数字のみのデータは指定通りの5文字目で改行されているが、日本語のみのデータは 3文字目で改行されている。


sqlite> .version
SQLite 3.51.3 2026-03-13 10:38:09 737ae4a34738ffa0c3ff7f9bb18df914dd1cad163f28fd6b6e114a344fe6d618
zlib version 1.3
msvc-1939 (64-bit)
sqlite> .mode box --wrap 5
sqlite> select * from sample;
┌────┬────────┬───────┐
│ id │  name  │ mail  │
├────┼────────┼───────┤
│ 1  │ test_  │ 1111@ │
│    │ 1111   │ examp │
│    │        │ le.co │
│    │        │ m     │
├────┼────────┼───────┤
│ 2  │ 吾輩は │ 2222@ │
│    │ 猫であ │ examp │
│    │ る。名 │ le.co │
│    │ 前はま │ m     │
│    │ だない │       │
│    │ 。     │       │
└────┴────────┴───────┘
                

参考URL