SQLite3のDBファイルのテーブルの値をいじくる visq3 を作ってみた。
SQLite3によって一気にRDBMSが身近になったものの、 データ保存を伴うスクリプトとかをSQLite3にしようとか思って早幾年、 なんか踏み切れない。
なんでかっつーと、
データをごにょごにょっとできない感
があるんじゃないかと。テストデータを突っこんで、あ、違った、とか 直したいときに、
update hoge set somecol='New Record' where uid=1234;
とかね。わかるけどさあ、タイプ数多いって。 だからついついYAMLとかテキスト形式の DB使っちゃう。
けど、シェルスクリプトで構築したシステムのDBを換えようとしたときに YAMLって訳に行かなくて(使えないから)、悩んだ。YAMLをいじくる Query Language がないからフロントエンドもない。 SQLite3だとsqlite3コマンドがある。じゃあRDBのほうが シェルスクリプトとの親和性が高いってことか。
ならsqlite3ファイルをごにょごにょできるようになればいいんだけど...
あ、それってwrapper作るだけで十分じゃん。 ということで: visq3
dbのスキーマを見る
visq data.sq3
20000 recs: d(id text primary key, val text)
3 recs: te(a text,b blob)
11 recs: foo(a primary key, b, c)
テーブルの値を編集する
visq3 data.sq3 d (viが起動するのでデータを編集して ZZ)
/tmp/visq3.001579aa/visq3-18472.txt: 20001 lines, 17645 characters.
20000 -> 20001
CSVで編集する方がしっくり来る
visq3 -c data.sq3 d
-c オプションでCSVモード。-s ';' とかでセパレータを変えられる。
Emacsがいいよ
EDITOR=emacs visq3 data.sq3 foo
テーブルの中味を見るだけ
visq3 data.sq3 foo | less
パイプに渡すとエディタ起動せず select * するだけ。
編集したけど前のに戻す
visq3 data.sq3 foo (でいじった後) : cp data.sq3~ data.sq3 (バックアップが ~ ファイルに書かれる)
おー、これでCGIのセッションキーとかのデバッグが楽になった。
これ psql とか mysql とかでも使える手法だな。
さいしょ Ruby の sqlite3 ライブラリで作ったのだが、csv化するときに 文字コードUTF-8じゃないとダメってことで却下。 起動もシェルスクリプトより遅いし。
ちなみにsqlite3はUTF-8のみの対応だが、実際にはデータにeuc-jpとか 入ってても出し入れは機能する。ただし、SELECT 時の LIKE 演算子が正常に機能しない。= では正常に取れる。 日本語部分でLIKE検索するようなものでなければ euc-jp でも行けるようだ(要追試)。