rubyrubygemsmariadbwindows-subsystem-for-linuxmysql2

Ruby DBI: Error connecting to MariaDB database


I wanted to follow the first steps of this guide (https://www.tutorialspoint.com/ruby/ruby_database_access.htm) and of course there was a problem.

This is what my code looks like:

#!/usr/bin/ruby -w

require "dbi"

begin
   # connect to the MySQL server
   dbh = DBI.connect("DBI:MariaDB:TESTDB:localhost", "testuser", "test123")
   # get server version string and display it
   row = dbh.select_one("SELECT VERSION()")
   puts "Server version: " + row[0]
rescue DBI::DatabaseError => e
   puts "An error occurred"
   puts "Error code:    #{e.err}"
   puts "Error message: #{e.errstr}"
ensure
   # disconnect from server
   dbh.disconnect if dbh
end

And this is what I receive

/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi.rb:74: warning: assigned but unused variable - meth
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi.rb:263: warning: assigned but unused variable - e2
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old initialize
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/utils/date.rb:42: warning: previous definition of initialize was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old initialize
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/utils/time.rb:16: warning: previous definition of initialize was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old initialize
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/utils/timestamp.rb:21: warning: previous definition of initialize was here
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:6: warning: assigned but unused variable - e
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old is_nullable?
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of is_nullable? was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old can_be_null?
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of can_be_null? was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old is_indexed?
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of is_indexed? was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old is_primary?
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of is_primary? was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old is_unique
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of is_unique was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old size
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of size was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old size=
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of size= was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old length
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of length was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old length=
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of length= was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old decimal_digits
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of decimal_digits was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old decimal_digits=
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of decimal_digits= was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old default_value
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of default_value was here
/var/lib/gems/2.7.0/gems/deprecated-2.0.1/lib/deprecated.rb:178: warning: method redefined; discarding old default_value=
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/columninfo.rb:83: warning: previous definition of default_value= was here
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/types.rb:110: warning: assigned but unused variable - civil
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/types.rb:111: warning: assigned but unused variable - time
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/handles.rb:12: warning: optional boolean argument is obsoleted
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/handles/database.rb:218: warning: parentheses after method name is interpreted as an argument list, not a decomposed argument
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/handles/database.rb:224: warning: parentheses after method name is interpreted as an argument list, not a decomposed argument
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/handles/statement.rb:307: warning: assigned but unused variable - cols
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/handles/statement.rb:324: warning: assigned but unused variable - cols
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/handles/statement.rb:358: warning: parentheses after method name is interpreted as an argument list, not a decomposed argument
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi/handles/statement.rb:364: warning: parentheses after method name is interpreted as an argument list, not a decomposed argument
Traceback (most recent call last):
        5: from dziad.rb:7:in `<main>'
        4: from /root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi.rb:145:in `connect'
        3: from /root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi.rb:160:in `_get_full_driver'
        2: from /root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi.rb:242:in `load_driver'
        1: from /root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi.rb:242:in `synchronize'
/root/.local/share/gem/ruby/2.7.0/gems/dbi-0.4.5/lib/dbi.rb:300:in `block in load_driver': Unable to load driver 'MariaDB' (underlying error: uninitialized constant DBI::DBD::MariaDB) (DBI::InterfaceError)

I have been using the GPT chat to install MariaDB and verify the gem versions. However, despite spending a considerable amount of time on it, I'm unable to make the following code work.

My setup: WSL version - 5.15.90.1-microsoft-standard-WSL2 Ruby version - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux-gnu] Debian version - 11.7 dbi (0.4.5, 0.4.0) mysql2 (0.5.5) My MariaDB after command sudo service mariadb status is running well.


Solution

    1. Gem dbi is abondoned 15 years ago. I'm not sure it works with Ruby 2.x.
    2. Use gem sequel to connect a database. Use gem mysql2 as driver for Sequel to connect MariaDB database.
    require 'bundler/inline'
    
    gemfile(true) do
      source "https://rubygems.org"
      gem 'sequel'
      gem 'mysql2'
    end
    
    #                             username password         database
    #                                ^        ^                 ^
    DB = Sequel.connect('mysql2://testuser:test123@localhost/testdb')
    row = DB.select(Sequel.lit('version()')).to_a
    puts "Server version: #{row[0]}"