やかんブログ

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をそのまま実行するようにしたい

この記事に関するお問い合わせはこちら

ページの先頭へ