SlideShare una empresa de Scribd logo
1 de 22
Descargar para leer sin conexión
                                                                    Rubyとデータベースとの連携技術




    Rubyとデータベースとの連携技術
    Integration Technology of Ruby and Database




                                              鹿児島大学 学術情報基盤センター
                                              学術情報処理研究部門
                                              古屋 保
                                              furuya@cc.kagoshima-u.ac.jp
K-Ruby, July 28, 2011       © Tamotsu FURUYA, All rights reserved.                   1
                                                                Rubyとデータベースとの連携技術



 内容
    ●   1. データベース連携概要
    ●   2. MySQLバインディングによる連携
    ●   3. ActiveRecordによる連携




K-Ruby, July 28, 2011   © Tamotsu FURUYA, All rights reserved.                   2
                                                                          Rubyとデータベースとの連携技術



 1. データベース連携概要
    ●   RubyとMySQLデータベースとの連携
         –    データベース抽象レイヤを使用せず,直接バインディングを使
              用してみる.(SQLを記述する必要がある)
                   「mysql2」…MySQL用のバインディング
                    Gem(https://github.com/brianmario/mysql2)

                 #MySQLのバインディングをインストールする
                 $ gem install mysql2




K-Ruby, July 28, 2011             © Tamotsu FURUYA, All rights reserved.                   3
                                                                          Rubyとデータベースとの連携技術



 1. データベース連携概要
    ●   Rubyとデータベースとの連携
         –    ほとんどのDBMSと連携可能
                   MySQL,PostgreSQL,Oracle,Microsoft SQL
                    Server,DB2,SQLite
                   各データベースAPIへのバインディングをGemで提供
         –    データベース抽象レイヤ(ActiveRecord)
                   DBの違いを意識することなくコーディング可能.




K-Ruby, July 28, 2011             © Tamotsu FURUYA, All rights reserved.                   4
                                                                        Rubyとデータベースとの連携技術



 2. MySQLバインディングによる連携
    ●
        連携するデータベース(テーブル)
         –    「students」テーブル(予めmysqlツールで作成)
              mysql> use test;
              mysql> CREATE TABLE students (
              -> id CHAR(11) NOT NULL,
              -> name VARCHAR(40),
              -> e_mail VARCHAR(80),
              -> PRIMARY KEY (id)
              ->);




K-Ruby, July 28, 2011           © Tamotsu FURUYA, All rights reserved.                   5
                                                                     Rubyとデータベースとの連携技術



 2. MySQLバインディングによる連携
    ●
        プログラム例
         # -*- coding: utf-8 -*-
         require 'mysql2'

         # ユーザ dbuser で MySQL の test データベースに接続する.
         client = Mysql2::Client.new(
                        :host => "localhost",
                        :database => "test",
                        :username => "dbuser",
                        :password => "pass"
                  )
         # SQLを実行し結果セットを得る.
         results = client.query("SELECT * FROM students")




K-Ruby, July 28, 2011        © Tamotsu FURUYA, All rights reserved.                   6
                                                                     Rubyとデータベースとの連携技術



 2. MySQLバインディングによる連携
    ●
        プログラム例
         # 結果セットから全レコードのカラムの値をイテレータで取得する.
         results.each do |row|
           printf "%st%st%sn", row["id"],
                    row["name"], row["e_mail"]
         end

         # データベースと接続をクローズする.
         client.close



              $ ruby dbaccess.rb
              1234567891    鹿児島太郎          taro@kago.jp
              1234567892    薩摩花子           hana@kago.jp
              1234567893    西郷隆盛           taka@satsuma.jp



K-Ruby, July 28, 2011        © Tamotsu FURUYA, All rights reserved.                   7
                                                                   Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   ActiveRecord
         –    データベース抽象レイヤのモジュール
         –    Ruby on Railsを構成するライブラリ群の1つ
         –    O/Rマッピング(Object / Relation Mapping)ライブラリ




K-Ruby, July 28, 2011      © Tamotsu FURUYA, All rights reserved.                   8
                                                                Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   O/Rマッピング
         –    データベースのレコードとRubyのオブジェクトをマップする
         –    テーブルのフィールドが、オブジェクトの属性となり,フィー
              ルド名がそのままアクセサとして定義される.




K-Ruby, July 28, 2011   © Tamotsu FURUYA, All rights reserved.                   9
                                                                     Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   プログラム例(ActiveRecord編)
         # -*- coding: utf-8 -*-
         require 'active_record'
            # 1.8系
           # require 'rubygems'
           # require 'activerecord'

         # データベースとの接続
         ActiveRecord::Base.establish_connection(
             :adapter => 'mysql2', # 使用するDBはMySQLデータベース
             :host => 'localhost',
             :database => 'test',
             :username => 'dbuser',
             :password => 'pass'
         )

                                                                      (次のスライドへ続く...)
K-Ruby, July 28, 2011        © Tamotsu FURUYA, All rights reserved.                   10
                                                                     Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   プログラム例(ActiveRecord編)
         # O/Rマッピング
                                                             id,name,e_mail等の
                                                              id,name,e_mail等の
         class Student < ActiveRecord::Base
                                                            属性メソッドは定義してない
                                                            属性メソッドは定義してない
         end                                                のにも関わらず...
                                                            のにも関わらず...

         students = Student.find(:all)
         students.each do |res|
           printf "%st%st%sn", res.id, res.name, res.e_mail
         end


              $ ruby dbaccess.rb
              1234567891    鹿児島太郎          taro@kago.jp
              1234567892    薩摩花子           hana@kago.jp
              1234567893    西郷隆盛           taka@satsuma.jp



K-Ruby, July 28, 2011        © Tamotsu FURUYA, All rights reserved.                   11
                                                                 Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   Conversion over Configuration(CoC)
         –    「設定よりも規約」(Railsの哲学)
         –    XMLファイルなどのコンフィグはいらない
         –    すべては命名規約に従うこと




K-Ruby, July 28, 2011    © Tamotsu FURUYA, All rights reserved.                   12
                                                                       Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●    YAMLファイルの利用
          –   YAML (YAML Ain't Markup Language)
          –   構造化されたテキストフォーマット
          –   Railsでは config/database.yml で利用

        YAMLファイルの例: database.yml(MySQL用)
         development_test:
           adapter: mysql2
           host: localhost
           database: test
           username: dbuser
           password: pass
           socket: /opt/local/var/run/mysql5/mysqld.sock
           encoding: utf8
           pool: 5

K-Ruby, July 28, 2011          © Tamotsu FURUYA, All rights reserved.                   13
                                                                           Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   プログラム例(ActiveRecord,YAML利用)
         # -*- coding:utf-8 -*-
         require 'active_record'


         # YAMLを利用したデータベースの接続
         ActiveRecord::Base.configurations
                              = YAML.load_file('database.yml')
         ActiveRecord::Base.establish_connection('development_test')


         class Student < ActiveRecord::Base
         end


         students = Student.find(:all)
         students.each do |res|
           printf "%st%st%sn", res.id, res.name, res.e_mail
         end


K-Ruby, July 28, 2011              © Tamotsu FURUYA, All rights reserved.                   14
                                                                           Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   findメソッドの使用法
        例えば...
        result = Student.find(2)


        これは次のSQL文と同等である
        SELECT * FROM students WHERE id = 2

        ※プライマリキーフィールドは「id」というフィールド名でなければNG

        解決策
        class Student < ActiveRecord::Base
            set_table_name 'gakusei' # テーブル名は任意でもOK
            set_primary_key 's_code'    # プライマリキーは任意でもOK
        end



K-Ruby, July 28, 2011              © Tamotsu FURUYA, All rights reserved.                   15
                                                                           Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   もうSQLは書かなくても良い?
        さらに条件をつけて抽出したい場合は...
        result = Student.find(:all,
                        :conditions => [ 'name = ?', '鹿児島太郎' ])

        SELECT * FROM students WHERE name = '鹿児島太郎'


        find以外にも次のようなメソッドも準備されている...
        result = Student.find_by_name("鹿児島太郎")

        さらにレコードの新規追加も...

        student = Student.new(:id => '1234567894',
             :name =>"川内次郎", :e_mail => 'jiro@kago.jp')
        student.save

K-Ruby, July 28, 2011              © Tamotsu FURUYA, All rights reserved.                   16
                                                                    Rubyとデータベースとの連携技術



 3. ActiveRecordによる連携
    ●   ホントにSQLは書かなくても良い?

        複雑なクエリーは,直接SQLで書くことも可能...

        result = Student.find_by_sql("SELECT * FROM students
          WHERE name LIKE '%太郎%' AND e_mail LIKE '%jp%'")


         まとめ...
          ● 規約に従えばきちんとO/Rマッピングしてくれる.

          ●
            マッピングできれば用意されたメソッドで結果セットを得られる.
          ●
            結果セットから属性メソッドでフィールドデータを得られる.
          ● 極力SQLを書かなくて済む

          ●
            データベースをいつでも交換できる
         その他...
          ● DMLだけでなくDDLも可能(Migrationクラス)




K-Ruby, July 28, 2011       © Tamotsu FURUYA, All rights reserved.                   17
                                                                                 Rubyとデータベースとの連携技術



 4. おまけ
    ●    テーブルのJOIN

    students(学生)                                                subjects(科目)
            id           name        e_mail                          id              name         teacher
        1234567891      鹿児島太郎    taro@kago.jp                      S01     情報科学入門               山田太郎
        1234567892      薩摩花子     hana@kago.jp                      S02     エンドユーザ実習             鈴木一郎
        1234567893      西郷隆盛     taka@kago.jp                      S03     応用数学                 松井秀喜

                         1                                                                  1

                                courses(履修)
                                   student_id           subject_id          rating
                                 1234567891       S02                      A
                                 1234567891       S03                      B
                             多   1234567892       S01                      C          多
                                 1234567893       S02                      B




K-Ruby, July 28, 2011                    © Tamotsu FURUYA, All rights reserved.                             18
                                                                                Rubyとデータベースとの連携技術



 4. おまけ
    ●
        結合ビュー

                 student_id     name               subject_id                   name   rating
              1234567891      鹿児島太郎          S02                      エンドユーザ実習         A
              1234567891      鹿児島太郎          S03                      応用数学             B
              1234567892      薩摩花子           S01                      情報科学入門           C
              1234567893      西郷隆盛           S02                      エンドユーザ実習         B




         mysql>         SELECT student_id, students.name, subject_id, 
             ->         subjects.name, rating
             ->         FROM students JOIN (courses JOIN subjects
             ->         ON courses.subject_id = subjects.id )
             ->         ON students.id = courses.student_id;


K-Ruby, July 28, 2011                  © Tamotsu FURUYA, All rights reserved.                    19
                                                                                 Rubyとデータベースとの連携技術



 4. おまけ
    ●    テーブルのJOIN

    students(学生)                                                subjects(科目)
            id           name        e_mail                          id              name           teacher
        1234567891      鹿児島太郎    taro@kago.jp                      S01     情報科学入門               山田太郎
        1234567892      薩摩花子     hana@kago.jp                      S02     エンドユーザ実習             鈴木一郎
        1234567893      西郷隆盛     taka@kago.jp                      S03     応用数学                 松井秀喜

    has_many :course                                                                        has_many :course
                                courses(履修)
                                   student_id           subject_id          rating
                                 1234567891       S02                      A
                                 1234567891       S03                      B
        belongs_to :student      1234567892       S01                      C          belongs_to :subject
                                 1234567893       S02                      B




K-Ruby, July 28, 2011                    © Tamotsu FURUYA, All rights reserved.                                20
                                                                    Rubyとデータベースとの連携技術



 4. おまけ
    ●
        テーブル間リレーションを意識した定義

         class Student < ActiveRecord::Base
             has_many :course
         end

         class Subject < ActiveRecord::Base
             has_many :course
         End

         class Course < ActiveRecord::Base
             belongs_to :student
             belongs_to :subject
         end



K-Ruby, July 28, 2011       © Tamotsu FURUYA, All rights reserved.                   21
                                                                  Rubyとデータベースとの連携技術



 4. おまけ
    ●
        結合結果の出力

    courses = Course.find(:all, :include => [:student, :subject])
    courses.each do |res|
       printf "%st%st%st%st%sn",
        res.student_id, res.student.name,
       res.subject_id, res.subject.name, res.rating
    end



     $ ruby dbaccess.rb
     1234567891   鹿児島太郎   S02       エンドユーザ実習                         A
     1234567891   鹿児島太郎   S03       応用数学                             B
     1234567892   薩摩花子    S01       情報科学入門                           C
     1234567893   西郷隆盛    S02       エンドユーザ実習                         B


K-Ruby, July 28, 2011     © Tamotsu FURUYA, All rights reserved.                   22

Más contenido relacionado

La actualidad más candente

BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告Uptime Technologies LLC (JP)
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)Uptime Technologies LLC (JP)
 
Stormの注目の新機能TridentAPI
Stormの注目の新機能TridentAPIStormの注目の新機能TridentAPI
Stormの注目の新機能TridentAPIAdvancedTechNight
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisitedUptime Technologies LLC (JP)
 
Postgre sql9.3新機能紹介
Postgre sql9.3新機能紹介Postgre sql9.3新機能紹介
Postgre sql9.3新機能紹介Daichi Egawa
 
GMOメディア RHEV-S-事例紹介
GMOメディア RHEV-S-事例紹介GMOメディア RHEV-S-事例紹介
GMOメディア RHEV-S-事例紹介Dai Utsui
 
Jubatus使ってみた 作ってみたJubatus
Jubatus使ってみた 作ってみたJubatusJubatus使ってみた 作ってみたJubatus
Jubatus使ってみた 作ってみたJubatusJubatusOfficial
 

La actualidad más candente (8)

MapR M7 技術概要
MapR M7 技術概要MapR M7 技術概要
MapR M7 技術概要
 
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
 
Stormの注目の新機能TridentAPI
Stormの注目の新機能TridentAPIStormの注目の新機能TridentAPI
Stormの注目の新機能TridentAPI
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited
 
Postgre sql9.3新機能紹介
Postgre sql9.3新機能紹介Postgre sql9.3新機能紹介
Postgre sql9.3新機能紹介
 
GMOメディア RHEV-S-事例紹介
GMOメディア RHEV-S-事例紹介GMOメディア RHEV-S-事例紹介
GMOメディア RHEV-S-事例紹介
 
Jubatus使ってみた 作ってみたJubatus
Jubatus使ってみた 作ってみたJubatusJubatus使ってみた 作ってみたJubatus
Jubatus使ってみた 作ってみたJubatus
 

Similar a Integration Technology of Ruby and DB.

RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成弘毅 露崎
 
Management of Gems using Bundler.
Management of Gems using Bundler.Management of Gems using Bundler.
Management of Gems using Bundler.Tamotsu Furuya
 
20101106 ramaze発表
20101106 ramaze発表20101106 ramaze発表
20101106 ramaze発表Fukui Osamu
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionGoh Matsumoto
 
初心者エンジニアのシステム構築失敗談
初心者エンジニアのシステム構築失敗談初心者エンジニアのシステム構築失敗談
初心者エンジニアのシステム構築失敗談Makoto Haruyama
 
LINEのMySQL運用について
LINEのMySQL運用についてLINEのMySQL運用について
LINEのMySQL運用についてLINE Corporation
 
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメKazuaki Takase
 
クラウドカンファレンスIn静岡 r cloud
クラウドカンファレンスIn静岡 r cloudクラウドカンファレンスIn静岡 r cloud
クラウドカンファレンスIn静岡 r cloudKazuki Aranami
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
 
Panel Discussion@WebDB forum 2014
Panel Discussion@WebDB forum 2014Panel Discussion@WebDB forum 2014
Panel Discussion@WebDB forum 2014Makoto Yui
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニックinfinite_loop
 
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室higaki
 
LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版LINE Corporation
 
20091030cakephphandson 02
20091030cakephphandson 0220091030cakephphandson 02
20091030cakephphandson 02Yusuke Ando
 
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京Koichiro Sasaki
 
20160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #520160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #5Koichiro Sasaki
 
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQLRyusuke Kajiyama
 

Similar a Integration Technology of Ruby and DB. (20)

RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
 
Summary of Ruby
Summary of RubySummary of Ruby
Summary of Ruby
 
Management of Gems using Bundler.
Management of Gems using Bundler.Management of Gems using Bundler.
Management of Gems using Bundler.
 
20101106 ramaze発表
20101106 ramaze発表20101106 ramaze発表
20101106 ramaze発表
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
初心者エンジニアのシステム構築失敗談
初心者エンジニアのシステム構築失敗談初心者エンジニアのシステム構築失敗談
初心者エンジニアのシステム構築失敗談
 
LINEのMySQL運用について
LINEのMySQL運用についてLINEのMySQL運用について
LINEのMySQL運用について
 
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメ
 
クラウドカンファレンスIn静岡 r cloud
クラウドカンファレンスIn静岡 r cloudクラウドカンファレンスIn静岡 r cloud
クラウドカンファレンスIn静岡 r cloud
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
Panel Discussion@WebDB forum 2014
Panel Discussion@WebDB forum 2014Panel Discussion@WebDB forum 2014
Panel Discussion@WebDB forum 2014
 
Datomic&datalog紹介
Datomic&datalog紹介Datomic&datalog紹介
Datomic&datalog紹介
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
 
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室
 
LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版
 
20091030cakephphandson 02
20091030cakephphandson 0220091030cakephphandson 02
20091030cakephphandson 02
 
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
 
20160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #520160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #5
 
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL
 
aws_opsworks
aws_opsworksaws_opsworks
aws_opsworks
 

Integration Technology of Ruby and DB.

  • 1. Rubyとデータベースとの連携技術 Rubyとデータベースとの連携技術 Integration Technology of Ruby and Database 鹿児島大学 学術情報基盤センター 学術情報処理研究部門 古屋 保 furuya@cc.kagoshima-u.ac.jp K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 1
  • 2. Rubyとデータベースとの連携技術 内容 ● 1. データベース連携概要 ● 2. MySQLバインディングによる連携 ● 3. ActiveRecordによる連携 K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 2
  • 3. Rubyとデータベースとの連携技術 1. データベース連携概要 ● RubyとMySQLデータベースとの連携 – データベース抽象レイヤを使用せず,直接バインディングを使 用してみる.(SQLを記述する必要がある)  「mysql2」…MySQL用のバインディング Gem(https://github.com/brianmario/mysql2) #MySQLのバインディングをインストールする $ gem install mysql2 K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 3
  • 4. Rubyとデータベースとの連携技術 1. データベース連携概要 ● Rubyとデータベースとの連携 – ほとんどのDBMSと連携可能  MySQL,PostgreSQL,Oracle,Microsoft SQL Server,DB2,SQLite  各データベースAPIへのバインディングをGemで提供 – データベース抽象レイヤ(ActiveRecord)  DBの違いを意識することなくコーディング可能. K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 4
  • 5. Rubyとデータベースとの連携技術 2. MySQLバインディングによる連携 ● 連携するデータベース(テーブル) – 「students」テーブル(予めmysqlツールで作成) mysql> use test; mysql> CREATE TABLE students ( -> id CHAR(11) NOT NULL, -> name VARCHAR(40), -> e_mail VARCHAR(80), -> PRIMARY KEY (id) ->); K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 5
  • 6. Rubyとデータベースとの連携技術 2. MySQLバインディングによる連携 ● プログラム例 # -*- coding: utf-8 -*- require 'mysql2' # ユーザ dbuser で MySQL の test データベースに接続する. client = Mysql2::Client.new( :host => "localhost", :database => "test", :username => "dbuser", :password => "pass" ) # SQLを実行し結果セットを得る. results = client.query("SELECT * FROM students") K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 6
  • 7. Rubyとデータベースとの連携技術 2. MySQLバインディングによる連携 ● プログラム例 # 結果セットから全レコードのカラムの値をイテレータで取得する. results.each do |row| printf "%st%st%sn", row["id"], row["name"], row["e_mail"] end # データベースと接続をクローズする. client.close $ ruby dbaccess.rb 1234567891 鹿児島太郎 taro@kago.jp 1234567892 薩摩花子 hana@kago.jp 1234567893 西郷隆盛 taka@satsuma.jp K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 7
  • 8. Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● ActiveRecord – データベース抽象レイヤのモジュール – Ruby on Railsを構成するライブラリ群の1つ – O/Rマッピング(Object / Relation Mapping)ライブラリ K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 8
  • 9. Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● O/Rマッピング – データベースのレコードとRubyのオブジェクトをマップする – テーブルのフィールドが、オブジェクトの属性となり,フィー ルド名がそのままアクセサとして定義される. K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 9
  • 10. Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● プログラム例(ActiveRecord編) # -*- coding: utf-8 -*- require 'active_record' # 1.8系 # require 'rubygems' # require 'activerecord' # データベースとの接続 ActiveRecord::Base.establish_connection( :adapter => 'mysql2', # 使用するDBはMySQLデータベース :host => 'localhost', :database => 'test', :username => 'dbuser', :password => 'pass' ) (次のスライドへ続く...) K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 10
  • 11. Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● プログラム例(ActiveRecord編) # O/Rマッピング id,name,e_mail等の id,name,e_mail等の class Student < ActiveRecord::Base 属性メソッドは定義してない 属性メソッドは定義してない end のにも関わらず... のにも関わらず... students = Student.find(:all) students.each do |res| printf "%st%st%sn", res.id, res.name, res.e_mail end $ ruby dbaccess.rb 1234567891 鹿児島太郎 taro@kago.jp 1234567892 薩摩花子 hana@kago.jp 1234567893 西郷隆盛 taka@satsuma.jp K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 11
  • 12. Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● Conversion over Configuration(CoC) – 「設定よりも規約」(Railsの哲学) – XMLファイルなどのコンフィグはいらない – すべては命名規約に従うこと K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 12
  • 13. Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● YAMLファイルの利用 – YAML (YAML Ain't Markup Language) – 構造化されたテキストフォーマット – Railsでは config/database.yml で利用 YAMLファイルの例: database.yml(MySQL用) development_test: adapter: mysql2 host: localhost database: test username: dbuser password: pass socket: /opt/local/var/run/mysql5/mysqld.sock encoding: utf8 pool: 5 K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 13
  • 14. Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● プログラム例(ActiveRecord,YAML利用) # -*- coding:utf-8 -*- require 'active_record' # YAMLを利用したデータベースの接続 ActiveRecord::Base.configurations = YAML.load_file('database.yml') ActiveRecord::Base.establish_connection('development_test') class Student < ActiveRecord::Base end students = Student.find(:all) students.each do |res| printf "%st%st%sn", res.id, res.name, res.e_mail end K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 14
  • 15. Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● findメソッドの使用法 例えば... result = Student.find(2) これは次のSQL文と同等である SELECT * FROM students WHERE id = 2 ※プライマリキーフィールドは「id」というフィールド名でなければNG 解決策 class Student < ActiveRecord::Base set_table_name 'gakusei' # テーブル名は任意でもOK set_primary_key 's_code' # プライマリキーは任意でもOK end K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 15
  • 16. Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● もうSQLは書かなくても良い? さらに条件をつけて抽出したい場合は... result = Student.find(:all, :conditions => [ 'name = ?', '鹿児島太郎' ]) SELECT * FROM students WHERE name = '鹿児島太郎' find以外にも次のようなメソッドも準備されている... result = Student.find_by_name("鹿児島太郎") さらにレコードの新規追加も... student = Student.new(:id => '1234567894', :name =>"川内次郎", :e_mail => 'jiro@kago.jp') student.save K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 16
  • 17. Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● ホントにSQLは書かなくても良い? 複雑なクエリーは,直接SQLで書くことも可能... result = Student.find_by_sql("SELECT * FROM students WHERE name LIKE '%太郎%' AND e_mail LIKE '%jp%'") まとめ... ● 規約に従えばきちんとO/Rマッピングしてくれる. ● マッピングできれば用意されたメソッドで結果セットを得られる. ● 結果セットから属性メソッドでフィールドデータを得られる. ● 極力SQLを書かなくて済む ● データベースをいつでも交換できる その他... ● DMLだけでなくDDLも可能(Migrationクラス) K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 17
  • 18. Rubyとデータベースとの連携技術 4. おまけ ● テーブルのJOIN students(学生) subjects(科目) id name e_mail id name teacher 1234567891 鹿児島太郎 taro@kago.jp S01 情報科学入門 山田太郎 1234567892 薩摩花子 hana@kago.jp S02 エンドユーザ実習 鈴木一郎 1234567893 西郷隆盛 taka@kago.jp S03 応用数学 松井秀喜 1 1 courses(履修) student_id subject_id rating 1234567891 S02 A 1234567891 S03 B 多 1234567892 S01 C 多 1234567893 S02 B K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 18
  • 19. Rubyとデータベースとの連携技術 4. おまけ ● 結合ビュー student_id name subject_id name rating 1234567891 鹿児島太郎 S02 エンドユーザ実習 A 1234567891 鹿児島太郎 S03 応用数学 B 1234567892 薩摩花子 S01 情報科学入門 C 1234567893 西郷隆盛 S02 エンドユーザ実習 B mysql> SELECT student_id, students.name, subject_id,  -> subjects.name, rating -> FROM students JOIN (courses JOIN subjects -> ON courses.subject_id = subjects.id ) -> ON students.id = courses.student_id; K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 19
  • 20. Rubyとデータベースとの連携技術 4. おまけ ● テーブルのJOIN students(学生) subjects(科目) id name e_mail id name teacher 1234567891 鹿児島太郎 taro@kago.jp S01 情報科学入門 山田太郎 1234567892 薩摩花子 hana@kago.jp S02 エンドユーザ実習 鈴木一郎 1234567893 西郷隆盛 taka@kago.jp S03 応用数学 松井秀喜 has_many :course has_many :course courses(履修) student_id subject_id rating 1234567891 S02 A 1234567891 S03 B belongs_to :student 1234567892 S01 C belongs_to :subject 1234567893 S02 B K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 20
  • 21. Rubyとデータベースとの連携技術 4. おまけ ● テーブル間リレーションを意識した定義 class Student < ActiveRecord::Base has_many :course end class Subject < ActiveRecord::Base has_many :course End class Course < ActiveRecord::Base belongs_to :student belongs_to :subject end K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 21
  • 22. Rubyとデータベースとの連携技術 4. おまけ ● 結合結果の出力 courses = Course.find(:all, :include => [:student, :subject]) courses.each do |res| printf "%st%st%st%st%sn", res.student_id, res.student.name, res.subject_id, res.subject.name, res.rating end $ ruby dbaccess.rb 1234567891 鹿児島太郎 S02 エンドユーザ実習 A 1234567891 鹿児島太郎 S03 応用数学 B 1234567892 薩摩花子 S01 情報科学入門 C 1234567893 西郷隆盛 S02 エンドユーザ実習 B K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 22