Ruby1.8+DBI::SQLite

Ruby言語体系を理解してきたので、さっそくDBあたりのプログラムを作ろうと思い立ったわけですが、どうにもうまくいかない。

ケッキョク、この組み合わせのケースのドキュメントが殆どなく、試行錯誤の限界に達したので、ソースを読んでみました。以下そのメモ

まず採番の問題。SQLiteでは not null primary key属性のあるカラムは自動的に insertするときにオートインクリメントするらしい(FAQより)。したがって insert するときにプライマリキーだけinsertしなければ採番の問題はとりあえず解決です。まぁこれはこれでヨシとしましょう。 さて、問題はここでinsertしたレコードに一体どのようなユニークなIDが振られたか?を取得するのが非常に悩ましいということです。 当然のことながらinsertした直後に selectというのはアトミックに動作しないから、却下です。で、SQLiteのFAQには 「sqlite_last_insert_rowid()」を使えとあります。SQLiteはCのライブラリベースのRDBなんでまぁこれはこれでよいんでしょうが、rubyのこのインタフェースを使おうとしたときには問題になります。 そのようなインタフェースがないので、ニントモカントモ正しく取得できそうにない・・・いや、ワタシが間違っているだけで、やり方あるのかもしれませんが・・・ 次に、AutioCommitを trueにして beginでロックをするという手法に挑戦。ですが、これをやってしまうと、他のクライアントが同時にDBにアクセスできずconnectでエラーに・・・これじゃWebアプリとかで使えませんね。せめて他が手放すまでブロックしてもらわないと・・・いや、ワタシが間違っているだけで、やり方があるのかもしれませんが・・・ とりあえず、もうちょっと調べてみようと思います。まずは最新バージョンにするところからかな。 まぁruby-dbiのバージョンみたら0.0.23って書いてあるから、まだまだこれからですかね。すなおに、この構成をアキラメルというのが正しい解法のような気もしますが、こんな構成で頑張っている人は世の中に何人いるんだろうか・・・ To be continued

Listing Trackbacks

Ruby1.8+DBI::SQLite その2

このまえの続き 結局、SQLite.cをのぞいてみたら、どこにも last_insert_rowid()らしきものはなし。ということで、どうあがいても使えないという結論になりました。 しゃーないので、自力でセコセコつくることに。といっても前後を眺めて、見よう見まねです。で、気がつい...

元祖ワシ的日記