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
に一致する行が少なすぎる。6
〜9
しか出ていない。10
〜26
も出て欲しい。だが、TEXT
型として文字列比較されてしまっているため、6
〜9
しか出ていない。
解決法は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を作れる。
関連記事
- SQLite3のテーブル&レコード作成を.importで行う(一時ファイル作らず)
- SQLite3でランダムに複数行を取得する
- SQLite3のODBCドライバをインストールする
- SQLite3をソースコードからビルドする(3.33.0)
対象環境
- Raspbierry pi 4 Model B
- Raspbian buster 10.0 2019-09-26 ※
- bash 5.0.3(1)-release 学習まとめ
- SQLite 3.33.0 ※ 学習まとめ
$ uname -a Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux