やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3ドットコマンド(.mode)

 出力形式を指定する。一部は入力形式の指定にもなる。

成果物

.help

.mode MODE ?TABLE?       Set output mode
.mode --help
Error: mode should be one of: ascii column csv html insert line list quote tabs tcl

.mode

テスト用ファイル作成

echo "create table users(id integer primary key, name text, class text);
insert into users(name,class) values('Yamada','A');
insert into users(name,class) values('Suzuki','B');
insert into users(name,class) values('Tanaka','A');" > create_0.sql

デフォルト

 デフォルトは.mode listである。

sqlite3 :memory: \
".read create_0.sql" \
"select * from users;"
1|Yamada|A
2|Suzuki|B
3|Tanaka|A

.mode一覧

for mode in ascii column csv html insert line list quote tabs tcl; do
    echo "-----.mode ${mode}"
    sqlite3 :memory: \
    ".read create_0.sql" \
    ".mode ${mode}" \
    "select * from users;"
done
-----.mode ascii
1YamadaA2SuzukiB3TanakaA-----.mode column
1           Yamada      A         
2           Suzuki      B         
3           Tanaka      A         
-----.mode csv
1,Yamada,A
2,Suzuki,B
3,Tanaka,A
-----.mode html
<TR><TD>1</TD>
<TD>Yamada</TD>
<TD>A</TD>
</TR>
<TR><TD>2</TD>
<TD>Suzuki</TD>
<TD>B</TD>
</TR>
<TR><TD>3</TD>
<TD>Tanaka</TD>
<TD>A</TD>
</TR>
-----.mode insert
INSERT INTO "table" VALUES(1,'Yamada','A');
INSERT INTO "table" VALUES(2,'Suzuki','B');
INSERT INTO "table" VALUES(3,'Tanaka','A');
-----.mode line
   id = 1
 name = Yamada
class = A

   id = 2
 name = Suzuki
class = B

   id = 3
 name = Tanaka
class = A
-----.mode list
1|Yamada|A
2|Suzuki|B
3|Tanaka|A
-----.mode quote
1,'Yamada','A'
2,'Suzuki','B'
3,'Tanaka','A'
-----.mode tabs
1  Yamada  A
2  Suzuki  B
3  Tanaka  A
-----.mode tcl
"1" "Yamada" "A"
"2" "Suzuki" "B"
"3" "Tanaka" "A"

.mode list + .separator

 .mode listのとき、デリミタは.separatorで決まる。

.separatorなし

sqlite3 :memory: \
".read create_0.sql" \
".mode list" \
"select * from users;"
1|Yamada|A
2|Suzuki|B
3|Tanaka|A

.separatorあり

sqlite3 :memory: \
".read create_0.sql" \
".mode list" \
".separator '-' ';'" \
"select * from users;"
1-Yamada-A;2-Suzuki-B;3-Tanaka-A;

.mode insert テーブル名

テーブル名なし

 もしテーブル名がなければテーブル名は"table"になってしまう。

sqlite3 :memory: \
".read create_0.sql" \
".mode insert" \
"select * from users;"
INSERT INTO "table" VALUES(1,'Yamada','A');
INSERT INTO "table" VALUES(2,'Suzuki','B');
INSERT INTO "table" VALUES(3,'Tanaka','A');

テーブル名あり

sqlite3 :memory: \
".read create_0.sql" \
".mode insert users" \
"select * from users;"
INSERT INTO users VALUES(1,'Yamada','A');
INSERT INTO users VALUES(2,'Suzuki','B');
INSERT INTO users VALUES(3,'Tanaka','A');

.mode column + .width

 .mode columnのとき、表示幅は.widthで決まる。

.widthを指定しない

sqlite3 :memory: \
".headers on" \
".mode column" \
"select 1 as id, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' as alphabet;"
id          alphabet                  
----------  --------------------------
1           ABCDEFGHIJKLMNOPQRSTUVWXYZ

.widthを指定する

sqlite3 :memory: \
".headers on" \
".mode column" \
".width -4 -30" \
"select 1 as id, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' as alphabet;"
  id                        alphabet
----  ------------------------------
   1      ABCDEFGHIJKLMNOPQRSTUVWXYZ

.import, .readとの併用

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで