Vimから任意のデータベースを操作

ふとSQLを勉強しようと思ったんですが、ちまちまコマンドラインのクライアントから入力するのはきついので、Vimから操作できないのかなーとか妄想してたら普通にありました。
dbext.vim - Provides database access to many DBMS (Oracle, Sybase, Microsoft, MySQL, DBI,..) : vim online

使い方

初期設定

まずはじめに使用するSQL等の設定をする必要があります。

:DBPromptForBufferParameters

か、<Leader>sbp(普通<Leader>は\)をすると対話形式で設定ができます。以下の項目などを設定します。
・使用するSQLの種類(MySQLとかSQLiteとか)
・ユーザー名
・パスワード
・サーバーのホスト名
・使用するデータベース名
他にももっといろいろと設定できることはあります。詳しくはhelpで。
設定した内容は、

:DBGetOption

で確認することができます。また、設定を変えたい場合は、再び :DBPromptForBufferParameters するか、

:DBSetOption user=mfumi
:DBSetOption user=mfumi:passwd=aaa

みたいに :DBSetOption で変えられます。
.vimrcに設定をあらかじめ書いておくこともできます。また、modelineを利用して設定することもできます。詳しくはhe(以下略

SQL文を実行する

設定が済んだら、

:DBExecSQL <SQL文>

で任意のSQLをデータベースに対して実行することができます。また、いくつかのSQL文にはテーブル名などの補完が効く専用のコマンドが用意されています。

:Select id from customer

Selectの他に、Update,Insert,Delete,Call,Drop,Alter,Create があります。
ちなみに、MySQLの場合ですが、:Create DATABASE AAA でデータベースを作ったあと、:DBExecSQL USE AAA , :Insert ... とやろうと思ってもできなくて、:Create DATABSE AAA したあとに :DBSetOption dbname=AAA と設定する必要があります。

ファイルに記述したSQL文を実行する

例えば、

SELECT id FROM customer;
^

とファイルに書いてあるとき、^の位置で<Leader>se、もしくは:DBExecSQLUnderCursorでカーソル下のSQL文を実行できます(デフォルトだと;まで実行)。
複数のSQL文を実行させたい場合は、ビュジュアルモードで選択して<Leader>seか、:DBExecVisualSQL or :'<,'>DBExecRangeSQL で実行できます。

その他の機能

・テーブルを表示
INSERT文書いてて、テーブルの内容見たいなーと思ったときとかに使えます。

INSERT INTO contact(id, cont_name, phone_nbr)
               ^

contact のどこかにカーソルがあるとき、<Leader>se もしくは

:DBSelectFromTable

をすると、customerテーブルの中身が表示されます。まぁ SELECT * FROM contact を実行してるわけです。
他にもいくつか種類があって、:DBSelectFromTableTopX (指定した行数だけ表示),:DBSelectFromTableWithWhere (where文を入力できる),:DBSelectFromTableAskName (テーブル名を指定)とかあります。詳しく(ry


・テーブルの情報を表示
上と同じようにcontactのどこかにカーソルがあるとき、<Leader>sdtもしくは

:DBDescribeTable

でテーブルの情報が表示されます。(MySQLだと DESC contact; に相当)


・テーブルの一覧を表示
上と同じように(以下略),Leader>dpもしくは

:DBListTable


・テーブルの列名ををヤンク
<Leader>slcもしくは

:DBListColumn

contactの例でいうと、 id, cont_name, phone_nbr がヤンクされます。


・補完

:DBCompleteTable
:DBCompleteViews

をすると、テーブル名やビュー名のディクショナリが作成され、<C-x><C-k>で辞書補完ができるようになります。


・履歴
<Leader>sh もしくは :DBHisotry で、いままでに実行したSQLの履歴が表示されます。エンターで再実行することができます。
ちなみに履歴のファイルはデフォルトで ~/dbext_sql_history.txt に作成されます。保存場所を変更するには、

let g:dbext_default_history_file = $HOME.'/.dbext_sql_history.txt'

みたいにします。

その他の情報

マッピングについて
マッピングは基本的に <Leader>s をprefixとしたキーに割り当てられます。ほとんどのコマンドに対してマッピングが割り当てられています。デフォルトのマッピングを無効にしたい場合は、

let g:dbext_default_usermaps = 0

でできます。


・実行するコマンドについて
自分はMySQLを利用してましたが、macportsMySQLをインストールすると、コマンドラインのクライアント名は/opt/local/bin/mysql5となります。dbext.vimだと初期設定のままだと、コマンド名は mysql なので、変更する必要があります。

let dbext_default_MYSQL_bin = 'mysql5'

他のコマンド名についても同様に変更できます。


・ヘルプ
ヘルプの2988行目あたり、

 added to your |.vimrc|: >
        autocmd BufRead */MyProjectDir/* DBSetOption variable_def_regex=\<\(p_\|lv_\)\w\+\>
<
 Or if you simply wanted to extended the existing defaults, you can
 retrieve the existing setting using dbext's DB_listOption function and
 concatenate the new regex separated by a comma: >
        autocmd BufRead */MyProjectDir/* DBSetOption variable_def_regex=,\<\(p_\|lv_\)\w\+\>
<

となってますが、*/MyProjectDir/* がヘルプのタイトルとして認識されてしまうので、:helptagsをしたときコマンド名が重複してますという旨のエラーがでます。pathogen使ってると起動時に毎回でてうざったいので自分は適当にヘルプを変えました。




ということで適当にdbextの説明をしてきましたが、dbextはかなり多機能です。ここで紹介したのはほんの一部なので気になる人はhelp読んでみて下さい。
ところで普通SQLを実行するときはみなさん何使ってるんでしょうか? 何か定番のGUIのソフトでもあるんでしょうかね。

おまけ

(1) 単にSQL勉強したいってだけならSQLzoo というサイトで、web上でSQLを試しながら勉強できます。
(2) SQLは大文字小文字区別しませんが、コマンド名は大文字で書くという慣習だそうで、これこそまさにvimのabbrの出番じゃん、と思ってたら同じことを考えてた人が案の定いて、vim.orgにありました。
sql_iabbr.vim - Makes all your favorite SQL keywords uppercase automatically. : vim online
これを~/.vim/ftplugin/sql/以下に入れておけば多分幸せになれます。ちなみにただ単純にabbrしてるんじゃなくて、hlID()を使って、コメントか定数文以外の場合にのみ展開します。こんな感じにhlID()って使えるんだなーと思ったり。