memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

センシティブなやっちゃのぉ〜...Ruby/Sqlite3は

授業準備をしていまして気づいたことをメモします。

とても有用なので、ちょっと古いですが以下の本を参考にしてきました。

Rubyでデータベースアクセスするプログラムを演習する回の資料を作っていました。

この本では多様なDBMSに対応できるようにdbiを使っているのですがRuby3.2.2の環境ではdbiが動作しませんでした。しかたがなくsqlite3で記述するように授業資料を書き換えていました。

ある問題を作成していたときにどうしても動作しなくてついさきほどまで困っていました。

以下のような簡単なテーブルを作成して

CREATE TABLE NAME_INFO (
    name VARCHAR(50)
);

以下のコードを実行しましたら。。。結果が出てこない。。。あれ?

require 'sqlite3'
db = SQLite3::Database.new('name_info.sqlite3')
db.results_as_hash = true
db.execute('SELECT * FROM NAME_INFO') do |row|
  puts row['NAME']
end
db.close

30分くらい悩んでいましたが、結果だけ書きます。

「puts row['NAME']」を「puts row['name']」と書かなければならなかったのでした。

SQLは小文字で書いても大文字に変換されるはず、という昔ながらの知識がありました。results_as_hashでハッシュで取り出せる指定をしたところで、元々のCREATE TABLE文で指定したカラム名が小文字だったら小文字で指定しないと取り出せない、という仕様のようです。dbiでは確か自動的に変換してくれたような気がするけど。。。

しかたがないです。郷に従います。

以上です。