                                                                    Rubyとデータベースとの連携技術    Rubyとデータベースとの連携技術    Integration...
                                                                Rubyとデータベースとの連携技術 内容    ●   1. データベース連携概要    ●   2. MySQL...
                                                                          Rubyとデータベースとの連携技術 1. データベース連携概要    ●   RubyとMyS...
                                                                          Rubyとデータベースとの連携技術 1. データベース連携概要    ●   Rubyとデータ...
                                                                        Rubyとデータベースとの連携技術 2. MySQLバインディングによる連携    ●      ...
                                                                     Rubyとデータベースとの連携技術 2. MySQLバインディングによる連携    ●        プ...
                                                                     Rubyとデータベースとの連携技術 2. MySQLバインディングによる連携    ●        プ...
                                                                   Rubyとデータベースとの連携技術 3. ActiveRecordによる連携    ●   ActiveRe...
                                                                Rubyとデータベースとの連携技術 3. ActiveRecordによる連携    ●   O/Rマッピング   ...
                                                                     Rubyとデータベースとの連携技術 3. ActiveRecordによる連携    ●   プログラム例...
                                                                     Rubyとデータベースとの連携技術 3. ActiveRecordによる連携    ●   プログラム例...
                                                                 Rubyとデータベースとの連携技術 3. ActiveRecordによる連携    ●   Conversion...
                                                                       Rubyとデータベースとの連携技術 3. ActiveRecordによる連携    ●    YAM...
                                                                           Rubyとデータベースとの連携技術 3. ActiveRecordによる連携    ●   ...
                                                                           Rubyとデータベースとの連携技術 3. ActiveRecordによる連携    ●   ...
                                                                           Rubyとデータベースとの連携技術 3. ActiveRecordによる連携    ●   ...
                                                                    Rubyとデータベースとの連携技術 3. ActiveRecordによる連携    ●   ホントにSQL...
                                                                                 Rubyとデータベースとの連携技術 4. おまけ    ●    テーブルのJO...
                                                                                Rubyとデータベースとの連携技術 4. おまけ    ●        結合ビュ...
                                                                                 Rubyとデータベースとの連携技術 4. おまけ    ●    テーブルのJO...
                                                                    Rubyとデータベースとの連携技術 4. おまけ    ●        テーブル間リレーションを意識した...
                                                                  Rubyとデータベースとの連携技術 4. おまけ    ●        結合結果の出力    courses...
Upcoming SlideShare
Loading in …5
×

Integration Technology of Ruby and DB.

971 views

Published on

Rubyとデータベースの連携技術

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
971
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Integration Technology of Ruby and DB.

  1. 1.  Rubyとデータベースとの連携技術 Rubyとデータベースとの連携技術 Integration Technology of Ruby and Database 鹿児島大学 学術情報基盤センター 学術情報処理研究部門 古屋 保 furuya@cc.kagoshima-u.ac.jpK-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 1
  2. 2.  Rubyとデータベースとの連携技術 内容 ● 1. データベース連携概要 ● 2. MySQLバインディングによる連携 ● 3. ActiveRecordによる連携K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 2
  3. 3.  Rubyとデータベースとの連携技術 1. データベース連携概要 ● RubyとMySQLデータベースとの連携 – データベース抽象レイヤを使用せず,直接バインディングを使 用してみる.(SQLを記述する必要がある)  「mysql2」…MySQL用のバインディング Gem(https://github.com/brianmario/mysql2) #MySQLのバインディングをインストールする $ gem install mysql2K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 3
  4. 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. 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. 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. 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.jpK-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 7
  8. 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. 9.  Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● O/Rマッピング – データベースのレコードとRubyのオブジェクトをマップする – テーブルのフィールドが、オブジェクトの属性となり,フィー ルド名がそのままアクセサとして定義される.K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 9
  10. 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. 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.jpK-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 11
  12. 12.  Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● Conversion over Configuration(CoC) – 「設定よりも規約」(Railsの哲学) – XMLファイルなどのコンフィグはいらない – すべては命名規約に従うことK-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 12
  13. 13.  Rubyとデータベースとの連携技術 3. ActiveRecordによる連携 ● YAMLファイルの利用 – YAML (YAML Aint 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: 5K-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 13
  14. 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 endK-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 14
  15. 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 endK-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 15
  16. 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.saveK-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 16
  17. 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. 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 BK-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 18
  19. 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. 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 BK-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 20
  21. 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 endK-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 21
  22. 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 エンドユーザ実習 BK-Ruby, July 28, 2011 © Tamotsu FURUYA, All rights reserved. 22

×