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コマンドを使った方がいいでしょう。