読者です 読者をやめる 読者になる 読者になる

Bonkura - Kenny

SIerで働く文系SEの記録

【Sinatra】SinatraからRuby/DBIを使ったMySQLへのアクセス

やりたいこと

SinatraからMySQLにSELECTを投げて、その結果をWeb画面上に表示します。 ActiveRecord?なにそれ美味しいの?

準備

ローカルPC(MacBook)で起動しているMySQLに接続する前提。 RubyやらSinatraやらのインストールは省略します。

Ruby/DBIをインストール

Ruby/DBIとは?

$ sudo gem install dbi
$ gem install dbd-mysql

下記2層から成り立つライブラリ。

  • DBI(データベースインターフェース)層@RDBMSに依存しない層
  • DBD(データベースドライバ)層@RDBMSに依存する層

アプリケーションからDBにアクセスする際に、RDBMSに依存しない、透過的なアクセスが可能になる。 わかりやすく言うと、ソースコートを少し書き換えるだけで、MySQLにでもSQLite3にでもアクセスする事が出来る。

ソースコード

main.rb

require 'sinatra'
require 'sinatra/reloader'
require 'rubygems'
require 'dbi'

get '/' do
  begin
  dbh = DBI.connect('dbi:Mysql:test:localhost','dbuser','dbuser')
  @sth = dbh.execute("select * from user;")
  rescue DBI::DatabaseError => e
    puts "DB接続エラー"
  ensure
  dbh.disconnect if dbh
  end
  erb:index
end

layout.erb

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>テストデータ表示</title>
<meta charset="utf-8">
<meta name="description" content="テストデータを表示する">
<meta name="author" content="kennygt51">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>テストデータを表示します。</h1>
<br>
<%= yield %>
</body>
</html>

index.erb

<table>
  <% @sth.each do |row| %>
    <tr>
    <% row.each_with_name do |val,name| %>
        <td><%= "#{val.to_s}".force_encoding("utf-8")%></td>
      <% end %>
    </tr>
<% end %>
</table>

表示結果

f:id:knygt15437:20160403133321p:plain

躓いた所

erb:inedxを記載する場所が間違っていた為、何度も真っ白のページが表示された。 shinatraというフレームワークへの理解が浅く、どこを直せばいいのかさっぱりだった。。