vimからdbにアクセスするためのplugin作りました

More than 1 year has passed since last update.

https://github.com/kamichidu/vim-vdbc

Relational DataBaseに対して、低レベルなクエリ実行系を提供するためのpluginです。
現状サポートしているRDBMSは、PostgreSQLとSQLite3です。

特定のdbに依存しない作りになってるはずなので、driverというモジュールを追加することによって、対応dbを増やせます。
標準添付のdriverは、

  • pg

    • psqlコマンドに依存
    • vimprocに依存
  • pg_libpq

    • コンパイルが必要
  • sqlite3

    • sqlite3コマンドに依存
    • vimprocに依存
  • sqlite3_libsqlite3

    • コンパイルが必要

      win64用のコンパイル済バイナリを同梱しているので、win64環境ならばコンパイルせずに最初から利用できます。
      またsqlite3のソースを同梱しているため、*nix環境でのコンパイルも、コンパイラがあればOKです。

です。
sqlite3サポートは、mattnさんが即座にpr送ってくれました。ありがとうございます。

mysqlや他のdbについては、patches wellcomeなスタンスです。

使い方について少しだけ。
細かいところは :help から参照してください。

try
    " コネクションの取得
    " 文字列のみで接続情報を渡すためには、↓
    " sqlite3* というのは、ドライバ名称をワイルドカードで指定可能でかつ、driverが持つ優先度の設定に従ってドライバを自動で選択します
    let C= vdbc#connect_by_dsn('vdbc:sqlite3*:dbname=:memory:')
    " または、辞書で接続情報を渡すこともできます
    " この方法だと、ドライバのワイルドカード指定はできません
    let C= vdbc#connect({
    \   'driver': 'sqlite3_libsqlite3',
    \   'dbname': ':memory:',
    \})

    " prepared statementを実行する
    " まず、statement handleを構築します
    let stmt= C.prepare('insert into a_table (column1, column2) values (?, ?)')

    " prepared文に対して、パラメータを渡して実行します
    call stmt.execute(['value1', 'value2'])
    call stmt.execute([1, 'value2'])

    " 使い終わったら、開放します
    call stmt.finish()

    " select結果をリストで取得します
    " この書き方はprepared文を作成し、その後パラメータを渡して実行、最後に開放という、↑で行ったやり方の簡易版です
    echo C.select_as_list('select * from a_table') " => [[value1, value2], [value1, value2], ...]
    " なので、パラメータを渡すことができます
    echo C.select_as_list('select * from a_table where column1 = ?', ['value1'])
    " select結果を辞書で取得します
    echo C.select_as_dict('select * from a_table') " => [{'column1': value1, 'column2': value2}, {'column1': value1, 'column2': value2}, ...]
    " こちらも同様に、パラメータを渡すことができます
    echo C.select_as_dict('select * from a_table where column1 = ?', ['value1'])
finally
    " 切断します
    " vim終了時に自動的にすべてのコネクションは開放されますが、明示的にやったほうが良いです
    if exists('C')
        call C.disconnect()
    endif
endtry