vimからMySQLのselect文を実行するスクリプト
2009年04月27日(月)07:54|那須
那須です。
私はputtyなどのターミナルでサーバに接続してから、開発を行うことが多いのですが、vimでプログラムを書きつつ、DBをチェックしたいときなどは vimを一旦サスペンドしてからMySQLのコンソールを開くなどをしてます。
慣れてしまえば、そんなに手間な動作でもないのですが、なんとかしたいものです。このようなときは、次のような対策が考えられるかと思います。
- screenを使う
- DB用とvim用にターミナルを複数開く
screenが使える環境であれば、文句なしに screenを使う状況なのですが、私がよく使っている開発サーバは、screenの動作が重く、積極的にscreenを使う気になれません。といって、DB用にターミナルをもうひとつ開いていても、つい別の用途で使ってしまい、いざというときにすぐデータの確認ができないということがあります。
前置きが長くなりましたが、そんなわけで、いちいちvimをサスペンドしなくてもMySQLにselect文を実行するための vimスクリプトを書いてみました。
" vim上からMySQLに接続しselect文を実行する
"
:if exists('g:loaded_mysql')
:finish
:endif
:let g:loaded_mysql = 1
:let s:save_cpo = &cpo
:set cpo&vim
:function! Mysql()
if ! exists('g:password')
:let g:password = input('password? ')
:endif
:let l:sql = input('sql? ')
:try
:if g:password == ''
:throw 'Please input password'
:elseif l:sql !~ '^select '
:throw 'Please input select-query'
:else
:let l:res = system("mysql -u [user] -p" . g:password ." -h[host] [db] -e'" . l:sql ."'")
:let l:tmpfile = tempname()
:execute ":redir > " . l:tmpfile
:silent! echo l:res
:redir END
:execute ":new " . l:tmpfile
:endif
:catch
:echo "EXCEPTION:" v:exception
":echo "THROWPOINT:" v:throwpoint
:endtry
:endfunction
:command Mysql :call Mysql()
:let &cpo = s:save_cpo
:finish
※コードをコピーして使うなどの際の注意点
:let l:res = system("mysql -u [user] -p" . g:password ." -h[host] [db] -e'" . l:sql ."'")
の[user]、[host]、[db]は、それぞれの環境にあわせて書き換えてください。 これらも入力させるようにするのもいいかもしれません。
vimスクリプトの使い方や文法は 名無しのvim使い vimスクリプト リファレンス などを参照してください。
スクリプト設置後、vimで下記コマンドを実行すると、パスワードを聞かれます。
:Mysql
パスワードを入力後、SQLの入力を求められるので、そこでSQLを入力してください。SQLは、簡易的にですが、select以外を実行することを防ぐため、”select”ではじまるSQLのみ許可します。SQLを入力すると、その結果が別ウィンドウに出力されるようになっています。二度目以降は、パスワードの入力は省略されます。
プログラムをするときに限らず、select結果をそのままエディタに貼り付けて、データ加工したい場合などにも使えるかと思います。
今後は、次のような課題に取り組みたいなと思っています。
- パスワードを入力するとき平文でそのままパスワードが表示される→パスワードは画面に表示されないようにしたい
- ワンラインでしかSQLが書けないため、複雑な条件のSQLを書くのが大変→エディタで書いたSQLをそのまま実行するようにしたい