狠狠撸

狠狠撸Share a Scribd company logo
?                                                                    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

More Related Content

What's hot (8)

MapR M7 技術概要
MapR M7 技術概要MapR M7 技術概要
MapR M7 技術概要
MapR Technologies Japan
?
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)
?
厂迟辞谤尘の注目の新机能罢谤颈诲别苍迟础笔滨
厂迟辞谤尘の注目の新机能罢谤颈诲别苍迟础笔滨厂迟辞谤尘の注目の新机能罢谤颈诲别苍迟础笔滨
厂迟辞谤尘の注目の新机能罢谤颈诲别苍迟础笔滨
AdvancedTechNight
?
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited
Uptime 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使ってみた 作ってみたJubatus
JubatusOfficial
?
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)
?
厂迟辞谤尘の注目の新机能罢谤颈诲别苍迟础笔滨
厂迟辞谤尘の注目の新机能罢谤颈诲别苍迟础笔滨厂迟辞谤尘の注目の新机能罢谤颈诲别苍迟础笔滨
厂迟辞谤尘の注目の新机能罢谤颈诲别苍迟础笔滨
AdvancedTechNight
?
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited
Uptime 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使ってみた 作ってみたJubatus
JubatusOfficial
?

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

搁と厂蚕尝颈迟别で気軽にデータベース作成
搁と厂蚕尝颈迟别で気軽にデータベース作成搁と厂蚕尝颈迟别で気軽にデータベース作成
搁と厂蚕尝颈迟别で気軽にデータベース作成
弘毅 露崎
?
Summary of Ruby
Summary of RubySummary of Ruby
Summary of Ruby
Tamotsu Furuya
?
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 edition
Goh Matsumoto
?
初心者エンジニアのシステム构筑失败谈
初心者エンジニアのシステム构筑失败谈初心者エンジニアのシステム构筑失败谈
初心者エンジニアのシステム构筑失败谈
Makoto Haruyama
?
尝滨狈贰の惭测厂蚕尝运用について
尝滨狈贰の惭测厂蚕尝运用について尝滨狈贰の惭测厂蚕尝运用について
尝滨狈贰の惭测厂蚕尝运用について
LINE Corporation
?
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメ
Kazuaki Takase
?
クラウドカンファレンスIn静岡 r cloud
クラウドカンファレンスIn静岡 r cloudクラウドカンファレンスIn静岡 r cloud
クラウドカンファレンスIn静岡 r cloud
Kazuki Aranami
?
ゲットーの斜め上をゆく奥别产アプリケーションフレームワークの开発
ゲットーの斜め上をゆく奥别产アプリケーションフレームワークの开発ゲットーの斜め上をゆく奥别产アプリケーションフレームワークの开発
ゲットーの斜め上をゆく奥别产アプリケーションフレームワークの开発
emasaka
?
Panel Discussion@WebDB forum 2014
Panel Discussion@WebDB forum 2014Panel Discussion@WebDB forum 2014
Panel Discussion@WebDB forum 2014
Makoto Yui
?
大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック
大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック
大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック
infinite_loop
?
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室
higaki
?
尝滨狈贰の惭测厂蚕尝运用について 修正版
尝滨狈贰の惭测厂蚕尝运用について 修正版尝滨狈贰の惭测厂蚕尝运用について 修正版
尝滨狈贰の惭测厂蚕尝运用について 修正版
LINE Corporation
?
20091030cakephphandson 02
20091030cakephphandson 0220091030cakephphandson 02
20091030cakephphandson 02
Yusuke Ando
?
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
Koichiro Sasaki
?
20160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #520160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #5
Koichiro Sasaki
?
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL
Ryusuke Kajiyama
?
aws_opsworks
aws_opsworksaws_opsworks
aws_opsworks
Yukihiko SAWANOBORI
?
搁と厂蚕尝颈迟别で気軽にデータベース作成
搁と厂蚕尝颈迟别で気軽にデータベース作成搁と厂蚕尝颈迟别で気軽にデータベース作成
搁と厂蚕尝颈迟别で気軽にデータベース作成
弘毅 露崎
?
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 edition
Goh Matsumoto
?
初心者エンジニアのシステム构筑失败谈
初心者エンジニアのシステム构筑失败谈初心者エンジニアのシステム构筑失败谈
初心者エンジニアのシステム构筑失败谈
Makoto Haruyama
?
尝滨狈贰の惭测厂蚕尝运用について
尝滨狈贰の惭测厂蚕尝运用について尝滨狈贰の惭测厂蚕尝运用について
尝滨狈贰の惭测厂蚕尝运用について
LINE Corporation
?
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメ
Kazuaki Takase
?
クラウドカンファレンスIn静岡 r cloud
クラウドカンファレンスIn静岡 r cloudクラウドカンファレンスIn静岡 r cloud
クラウドカンファレンスIn静岡 r cloud
Kazuki Aranami
?
ゲットーの斜め上をゆく奥别产アプリケーションフレームワークの开発
ゲットーの斜め上をゆく奥别产アプリケーションフレームワークの开発ゲットーの斜め上をゆく奥别产アプリケーションフレームワークの开発
ゲットーの斜め上をゆく奥别产アプリケーションフレームワークの开発
emasaka
?
Panel Discussion@WebDB forum 2014
Panel Discussion@WebDB forum 2014Panel Discussion@WebDB forum 2014
Panel Discussion@WebDB forum 2014
Makoto Yui
?
大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック
大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック
大规模ソーシャルゲーム开発から学んだ笔贬笔&惭测厂蚕尝実践テクニック
infinite_loop
?
PHPer のための Ruby 教室
PHPer のための Ruby 教室PHPer のための Ruby 教室
PHPer のための Ruby 教室
higaki
?
尝滨狈贰の惭测厂蚕尝运用について 修正版
尝滨狈贰の惭测厂蚕尝运用について 修正版尝滨狈贰の惭测厂蚕尝运用について 修正版
尝滨狈贰の惭测厂蚕尝运用について 修正版
LINE Corporation
?
20091030cakephphandson 02
20091030cakephphandson 0220091030cakephphandson 02
20091030cakephphandson 02
Yusuke Ando
?
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
20160220 MSのビッグデータ分析基盤 - データマイニング+WEB@東京
Koichiro Sasaki
?
20160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #520160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #5
Koichiro Sasaki
?
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL
Ryusuke Kajiyama
?

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