やってみる

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

SQLite3のテーブル&レコード作成を.importで行う(TSVをstdinで受け取る)

 shellコマンドで作ったTSVからDBを作れる。

成果物

手順

 キモは.importの第一引数に/dev/stdinを渡すこと。

.import /dev/stdin $TABLE_NAME

 するとsqlite3の.importはTSVを標準入力から受け取れる。以下のように。

echo 'TSV' | sqlite3 :memory: .import /dev/stdin $TABLE_NAME

 実際にやってみた。

TABLE_NAME=Names
paste <(cat <(echo 'Id') <(echo {1..26} | tr ' ' '\n')) <(cat <(echo 'Name') <(echo {A..Z} | tr ' ' '\n')) | 
sqlite3 :memory: -batch -interactive '.mode tabs' '.headers on' \
'.import /dev/stdin '"$TABLE_NAME" \
'select * from sqlite_master' \
'select * from '"$TABLE_NAME"
type name    tbl_name    rootpage    sql
table   Names   Names   2  CREATE TABLE Names(
  "Id" TEXT,
  "Name" TEXT
)
Id  Name
1  A
2  B
3  C
4  D
5  E
6  F
7  G
8  H
9  I
10 J
11 K
12 L
13 M
14 N
15 O
16 P
17 Q
18 R
19 S
20 T
21 U
22 V
23 W
24 X
25 Y
26 Z

問題と解決

列の型がすべてTEXT型になり数値比較できない

 .importで作成されたテーブル列の型は、すべてTEXT型になってしまう。そのせいで数値型の比較が期待した通りにならない。

TABLE_NAME=Names
paste <(cat <(echo 'Id') <(echo {1..26} | tr ' ' '\n')) <(cat <(echo 'Name') <(echo {A..Z} | tr ' ' '\n')) | 
sqlite3 :memory: -batch -interactive '.mode tabs' '.headers on' \
'.import /dev/stdin '"$TABLE_NAME" \
'select * from sqlite_master' \
'select * from '"$TABLE_NAME"' where Id>5'
type name    tbl_name    rootpage    sql
table   Names   Names   2  CREATE TABLE Names(
  "Id" TEXT,
  "Name" TEXT
)
Id  Name
6  F
7  G
8  H
9  I

 最後のselect文にあるwhere Id>5に一致する行が少なすぎる。69しか出ていない。1026も出て欲しい。だが、TEXT型として文字列比較されてしまっているため、69しか出ていない。

 解決法はcast()すること。

TABLE_NAME=Names
paste <(cat <(echo 'Id') <(echo {1..26} | tr ' ' '\n')) <(cat <(echo 'Name') <(echo {A..Z} | tr ' ' '\n')) | 
sqlite3 :memory: -batch -interactive '.mode tabs' '.headers on' \
'.import /dev/stdin '"$TABLE_NAME" \
'select * from sqlite_master' \
'select * from '"$TABLE_NAME"' where cast(Id  as decimal)>5'
...
Id  Name
6  F
7  G
8  H
9  I
10 J
11 K
12 L
13 M
14 N
15 O
16 P
17 Q
18 R
19 S
20 T
21 U
22 V
23 W
24 X
25 Y
26 Z

所感

 いいね。即席でDBを作れる。

関連記事

対象環境

$ uname -a
Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux