#dbiに名前付きパラメータを渡せるようになるパッチを書いてみました: https://gist.github.com/4584670 #ども。dbi-executeやdbi-doで実パラメータを渡すときに (<string> . <value>) を渡すようになってますが、これは何か他のライブラリでこうなっていたから、というような理由はありますか?
#特に無いなら (<symbol> . <value>) や (<keyword> . <value>) とするか、いっそキーワード引数のように (dbi-execute query :x "zx" :y "zy") でもいいかなと思いまして。
#sql-tokenize が (parameter <string>) を返すようになっていたので、それに倣ったまででした。後者は直感的にわかりやすくていいですね。キーワードの連想リストを (apply dbi-execute query alist) する、ということがちょっと面倒になりそうではありますが。
#sql-tokenizeはあくまでトーカナイザなので、実際に使うにあたっては<string>に縛られなくても良いと思います。alistをapplyできるかどうか、というのは確かにポイントですね。キーワード-値形式と両方受け付けることもできなくはないですが、柔軟すぎるかなあ。ちょっと考えてみます。
#あ、あと名前付きパラメータってどのくらいサポートされてるんですかね。dbi-prepareは本来、下位のDBMSがプリペアドステートメントをサポートしている場合はそれに丸投げするってのが意図で、DBMSがサポートしない場合のフォールバックとしてGauche側でSQLのパーズと構築をやるって設計になってます。今あるdbdだとそれを有効利用してないんですが… 「DBMSが'?'のみサポートしている場合、'?'が含まれるプリペアドステートメントはDBMSに投げて、':名前' が含まれる場合はGauche側で何かする」というのを各dbdで実装してもいいんですが、このへん少し汎用的なサポートがあった方がdbdが書きやすいかなあ。dbd側で「名前なしは使えるけど名前付きは使えないよ」とさえ書いておけばdbi側でよしなにはからってくれる、というような。
#ドライバレベルで触ったことがあるのはSQLite3くらいなんですが、少なくともSQLite3に関してはサポートされてますね: http://www.sqlite.org/c3ref/bind_parameter_index.html 各種dbd実装は眺めてみたのですが、仰るとおりの状況でしたのでそっとしておきました。既に位置パラメータをdbd側で実装しているドライバがあるとすれば、dbi側で吸収してくれる仕組みがあったほうが互換性は保たれますね。 #Gauche-dbd-sqlite3もプリペアドステートメントをDBMS側に投げるのはやってないのかな https://github.com/mhayashi1120/Gauche-dbd-sqlite3/blob/master/dbd/sqlite3.scm まあGauche側サポートをとりあえず入れておいて、徐々にdbdの方を直してゆくのがいいかな。