「作りながら学ぶRuby入門第2版」で表記のようなエラーが起きました。
この章では、データベース接続ライブラリであるRuby/DBIが、異なる種類のデータベースであっても、同じようなプログラムによってアクセスできるという機能を提供することを学びました。
Ruby/DBIを使ってデータベースにアクセスしようとすると、SQLite3が呼び出せないとエラーがでました。
当初の環境・状況
Ruby -v :2.5.3-1
1 SQLite3用のDBD dbd-sqlite3やSQLite3用のライブラリsqlite3-rubyをRubygemsを使ってインストールした。
2 sqlite3はコマンドプロンプトで正常に起動、データベース作成できること確認済
3 sqlite3 dll、sqlite3.def(64bit版のものダウンロードし、解凍)を実行プログラムの保存先に移動
以下のようにファイルに記述し、Ruby/DBIを使ってデータベースに接続しようとした。
# -*- coding: shift-jis -*-
require 'rubygems'
require 'dbi'
dbh = DBI.connect('DBI:SQLite3:test01.db')
dbh.select_all('select * from person') do |row|
print "row=#{row} \n"
print "name = #{row[0]}\n"
print "age = #{row[1]}\n"
print "\n"
end
dbh.disconnect
エラー内容
しかしこのようなエラーがでました。SQLite3が呼び出せないということでしょうか。
Unable to load driver 'SQLite3' (underlying error: uninitialized constant DBI::DBD::SQLite3 (DBI::InterfaceError)
Did you mean? DBI::SQL_INTEGER)
teratailで調べてみると
確かにMSYS2/MinGW環境ではご質問にあるような問題が発生することがあります。新しいバージョンのRubyがリリースされたけれど、sqlite3の方がそのバージョンに対応していないときに起こります。
2018年5月時点では、sqlite3がRuby 2.5に対応していません。
しかし、次の手順で解決するはずです。
$ gem uninstall -a sqlite3
$ gem install sqlite3 --platform=ruby
というアドバイスがあったため、そのとおりにしてみたが、うまくいかなかった。(この記事ではその解決方法は記述していません。)
Rubyのバージョンを2.4.5-1にして解決
なお、別のteratailRubyでSQLite3を使えるようにしたいが、Unable to load driver 'SQLite3' となってしまうの質問者は、著者のサポートを受け、Ruby 2.4.3-2をインストールし再度環境構築を行ったところ、エラーが解消したとのことだったので、私も同じようにバージョンを下げて対応しました。2019.1.1時点では一つ前のバージョンが2.4.5-1だったのでそれにしました。
バージョンを変える手順
2 再インストール
Rubyインストーラーfor windowsを開き、Ruby2.4.5-1-x64 with MSYS2を再インストールしました。
3 必要なものをRubygemを用いてインストール
sqlite3をRubygemを使う方法で、インストールしようとしたところエラー。
C:\Users\ユーザー名\ruby_ex> gem install sqlite3
gem : 用語 'gem' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含ま
れている場合はそのパスが正しいことを確認してから、再試行してください。
gemが効かない。
gemが入っているかどうか確認する。
C:\Users\ユーザー名\ruby_ex> gem
gem : 用語 'gem' は、コマンドレット、関数、スクリプト ファイル
、または操作可能なプログラムの名前として認識されません。名前が
正しく記述されていることを確認し、パスが含まれている場合はその
パスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ gem
+ ~~~
+ CategoryInfo : ObjectNotFound: (gem:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
入っていない。新しくRubyをインストールしたときにgemがインストールされていなかったのかな。
前はできたのですが・・・
Rubygemのインストール方法
1 zipファイルをインストールし、作業をしているディレクトリに解凍する。
2 インストールができているところ
その後、コマンドでgemと入力すると、help画面が表示されたのでgemがインストールされていることが確認できた。
sqlite3、dbi、dbd-sqlite3を再度インストール
Rubyのバージョンを変えたので、再度必要なものをインストールしました。
前イントールしてたしいけるかなと思ったらありませんと言われたので・・・
C:\Users\ユーザー名>gem install sqlite3
Successfully installed sqlite3-1.3.13-x64-mingw32
Parsing documentation for sqlite3-1.3.13-x64-mingw32
Done installing documentation for sqlite3 after 0 seconds
1 gem installed
C:\Users\ユーザー名\ruby_ex>gem install dbi
Fetching: deprecated-2.0.1.gem (100%)
Successfully installed deprecated-2.0.1
Fetching: dbi-0.4.5.gem (100%)
Successfully installed dbi-0.4.5
Parsing documentation for deprecated-2.0.1
Installing ri documentation for deprecated-2.0.1
Parsing documentation for dbi-0.4.5
Installing ri documentation for dbi-0.4.5
Done installing documentation for deprecated, dbi after 3 seconds
2 gems installed
C:\Users\ユーザー名\ruby_ex>gem install dbd-sqlite3
Fetching: sqlite3-ruby-1.3.3.gem (100%)
#######################################################
Hello! The sqlite3-ruby gem has changed it's name to just sqlite3. Rather than
installing `sqlite3-ruby`, you should install `sqlite3`. Please update your
dependencies accordingly.
Thanks from the Ruby sqlite3 team!
<3 <3 <3 <3
#######################################################
Successfully installed sqlite3-ruby-1.3.3
Fetching: dbd-sqlite3-1.2.5.gem (100%)
Successfully installed dbd-sqlite3-1.2.5
Parsing documentation for sqlite3-ruby-1.3.3
Installing ri documentation for sqlite3-ruby-1.3.3
Parsing documentation for dbd-sqlite3-1.2.5
Installing ri documentation for dbd-sqlite3-1.2.5
Done installing documentation for sqlite3-ruby, dbd-sqlite3 after 1 seconds
2 gems installed
全てインストールできました。
そして、目的としていたデータへのアクセスができました。
C:\Users\ユーザー名\ruby_ex>ruby ex2106.rb
row=#<DBI::Row:0x00000000033f3970>
name=shin
age=45
row=#<DBI::Row:0x00000000033f3240>
name=Hiroshi
age=42
row=#<DBI::Row:0x00000000033f2b88>
name=Masaru
age=15
今回のエラーのまとめ
sqlite3は2019.1.1時点でRuby2.5に対応していないのでバージョンを変える必要がある
これくらいしか思いつきませんが、データベース関係の知識も今後蓄えていく必要がありました。
私自身、DBIがなぜ必要かぼんやりとしかわからないため、この本を通してもう少し学んでいく必要がありそうです。
調べていると、DBIは実用するには古すぎるとか、ActiveRecord経由のほうがいいという助言もあったので。。。