マイクロソフトは より効率的、かつ大量のデータを使ったデータ分析のための基盤を急ピッチで拡充しています。
分析自体やデータ準備の前処理における手段の1つとして使って頂くことを想定している各種製品?サービスについて説明します。
具体的には、R の並列実行環境である Microsoft R Server、Power BI、並列処理基盤である Azure Data Lake Analytics、Azure Machine Learning を取り上げます。
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