Gauche > Archives > 2013/01/21

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