2007-03-28  dbishで/(スラッシュ)を使うには

dbishはPerl-DBI(DataBase Interface)の対話的なコマンド・シェルです。私は専らSQLiteのDBを操作するときに使っています。

さて,dbishでSQL文を発行していると/(スラッシュ)がエラーになってしまうことがあります。例えば,以下のようなコマンドを入力すると

SELECT * FROM t WHERE a < 100/2 ;

「DBD::SQLite::db prepare failed: near "SELECT": syntax error(1) at dbdimp.c line 269, <FIN>line 12.」みたいなエラーが発生します。どうしたら良いのでしょうか。

スラッシュはdbishのメタ文字

どうしてスラッシュがだめなのかというと,スラッシュはdbishのメタ文字だからなのです。普通,SQLではスラッシュを除算記号として扱います。問題が起きる原因は,dbishの内部でSQLとシェルコマンドとの区別が付かなくなるからなのでしょう。「\/」としたり「//」とすればメタ文字をエスケープできそうな気がしたのですが,うまくいきませんでした。

でも回避方法をふたつ見つけたのでお話します。

【回避方法1】runコマンドを使う

まずFILENAMEというファイルを用意します(ファイル名は例なので何でも良いです)。FILENAMEにはあらかじめ実行したいSQL文を書いておきます。

dbishのプロンプトから「/run FILENAME」とすると,dbishはFILENAMEに書かれたSQL文を実行してくれます。FILENAMEの中身はdbishのメタ文字の影響を受けません。

【回避方法2】command_prefixを変更する

dbishのプロンプトから「/option command_prefix=[#]」とするとcommand_prefixを#(番号記号)に替えることができます(番号記号はあくまで例です。好きな記号を使うことができます)。シェル上で入力するSQL文は

SELECT * FROM t WHERE a < 100/2 #

のようになります。たしかにスラッシュが使えるようになるのですが,コマンドの見た目が変かもしれません。気になる方はrunコマンドを使った方がいいでしょう。