るびくる: | |
RB(あーるびー): |
本日の「るびくる&RBのRubyプログラミング大作戦!」は2012年大みそか大特番スペシャルです! |
|
いきなりハードル上げないでよるびくる! 量も内容もいつも通りだから! |
るびくる、先月リリースした家計簿Webアプリ、なかなかいい感じの評判らしいね。 |
|
うん、いい感じだよ! |
|
ただ、さっき僕もひさしぶりに触ってみたんだけど……画面の読み込みが遅くなってきてない? |
|
そうなんだよねー。 |
|
まあ、原始的なファイル保存形式でやってるから、いずれこうなるのは必然だったよね。 |
|
でももう、データの読み書きまわりの処理は、私がプリン片手に必死でチューニングしてるし |
|
ああ、最近プリンの消費率がやたら高いと思ってたら、そういうことだったんだね。 |
|
ムリムリムリ!! データベース化なんて絶対無理!!! |
|
ちょ、どうしたの!? |
|
SQLこわい……SQLこわい……SQLこわい……(ぶつぶつ) |
|
何のトラウマ!? やめてひたすらSQLSQLつぶやくのやめて! |
|
Tran○ac○-SQLこわい……Or○○leこわい……A○○.N○○こわい……○○○○○○こわい…… |
|
具体的なソフトウェア名やライブラリ名はもっとダメーーー!! |
落ち着いた? |
|
うん、もう大丈夫だよ! |
|
今のやりとりの後にそんな笑顔で言われても、普通に恐怖しか沸いてこないんだけど……。 |
|
え、その「Sequel」や「ActiveRecord」ってなに? |
|
簡単に言うと、データベースを扱いやすくするためのツールキット(ライブラリ)だよ。 |
|
うーん、ActiveRecordの名前くらいなら聞いたことがあるんだけど…… |
|
そっか。それじゃ、今回はデータベース編ということにして |
|
やだなあRB、わたしはいつも通りだよ! |
|
無闇やたらにいい笑顔を振りまかれても、引くよ。 |
でも、そのSequelっていったいどんなものなの? |
|
本当にそこまでの憎しみなら、さすがにちょっと難しいかもしれないけど…… |
|
え!? Sequelってデータベースを使うのに、SQL文を書く必要がないの!? |
|
うん。もちろん書くこともできるんだけど |
|
「テーブルを定義したりすることもできる」……ってことは、CREATE TABLE文を書く必要さえないの? |
|
うん、ないよ。 |
|
うーん……今まで「データベース=SQL」な印象しかなかったから |
|
失礼な! 変な壺もなにも買わせる気はないよ! |
|
もしくは「僕と契約してマスコットになってよ!」とかそんなことを…… |
|
マスコットも魔法少女もならなくていいから。 |
まず前提として、Sequelには、大きくわけて次の2つの使い方がある。
|
|
はーい。 |
|
たとえば、Rubyで何かのデータベースにアクセスして、データをとってきたいとするよね。 |
|
うーん、わたしのイメージだとこんな感じかなぁ。 |
# encoding: utf-8 require 'mysql' # 1. サーバー名やDB名を指定して、DBに接続する DB = Mysql.connect('mysqlserver.example.net', 'username', 'password', 'testdb', encoding: 'utf8') # 2. SQL文を実行して、色が「赤」であるデータを名前順に取得する sql = 'SELECT * FROM mascots WHERE color = ? ORDER BY name' rows = DB.query(sql, '赤') # 3. 取得したデータの内容(name)を表示する rows.each do |row| p row[:name] # => 'るびくる' end
そのコードをSequelを使って書き換えると、こうなる。 |
# encoding: utf-8 require 'sequel' # 1. サーバー名やDB名を指定して、DBに接続する DB = Sequel.connect('mysql://username:password@mysqlserver.example.net/testdb', encoding: 'utf8') # 2. SQL文を実行して、色が「赤」であるデータを名前順に取得する mascot_dataset = DB[:mascots] mascot_dataset = mascot_dataset.where(:color => '赤').order(:name) rows = mascot_dataset.to_a # 3. 取得したデータの内容(name)を表示する rows.each do |row| p row[:name] # => 'るびくる' end
あれ? 本当にSQL文を書いてないし、それになんだかデータ取得部分の処理がちょっと違うね。 |
|
OK。2つのスクリプトを、順に比較して解説していこうか。 |
それじゃこの続きは年明け公開予定の「パート2:概要編・後半」に、こうご期待! |
|
え、ちょっと待って、ここでパート1終了なの!? すごい中途半端っていうかキリ悪くない!? |
|
それではみなさん、よいお年を! |
|
2012年の大みそかをこんなもどかしい気持ちで迎えるのはいやだーー!! |
パート2:概要編・後半に続きます。