-> English version



るびくる&RBのRubyプログラミング大作戦!
Sequelを使えばSQLも怖くない!(パート1:概要編・前半)

このエントリーをはてなブックマークに追加

るびくる:
Rubyの自称マスコットキャラクター。
年末年始はだいたい紅白と寝正月を楽しんで過ごす。年末大掃除の伝統は完全に無視する。

RB(あーるびー):
解説役兼るびくるの指導役。
今年気になってることを来年に持ち越すのが嫌いなタイプなので、年末年始は3〜4日がかりでゆっくり大掃除して
最後に清々しい気分で紅白を見てのんびりする。


本日の「るびくる&RBのRubyプログラミング大作戦!」は2012年大みそか大特番スペシャルです!
年末にふさわしい大ボリュームでお届けしま

いきなりハードル上げないでよるびくる! 量も内容もいつも通りだから!


るびくる、先月リリースした家計簿Webアプリ、なかなかいい感じの評判らしいね。

うん、いい感じだよ!
ユーザーさんも100ユーザーを超えたし、これからももっとユーザーさんを増やしていきたいね。

ただ、さっき僕もひさしぶりに触ってみたんだけど……画面の読み込みが遅くなってきてない?

そうなんだよねー。
私も気になって見てみたんだけど
データファイルの読み込みや検索にかかる時間が、けっこう馬鹿にできなくなってきてるみたいなの。

家計簿の一覧ページにアクセスしたときのデータ読み込みだけで、3〜5秒くらいかかったりとか……。
ユーザーさんが増えて、データ量が増えてきたからかな?

まあ、原始的なファイル保存形式でやってるから、いずれこうなるのは必然だったよね。
YAML形式のファイルは、XMLと同じで手軽だし、設定ファイルの読み書きなんかにはいいんだけど
もともと大量のデータの高速な読み書きにはあんまり向いてないし……。

でももう、データの読み書きまわりの処理は、私がプリン片手に必死でチューニングしてるし
ほかに一気に早くできそうなボトルネックも残ってないしなぁ……。

ああ、最近プリンの消費率がやたら高いと思ってたら、そういうことだったんだね。
でもキーボード叩くかたわらでプリン食べるのは、行儀悪いからやめた方がいいと思うよ。

それじゃるびくる、この際だからデータベースに移行してみるってのはどう?
もっとシステムを大きくしていきたいなら、遅かれ早かれいつかは通る道だし
それなら、今のうちにデータベースへ移行しておいた方が……

ムリムリムリ!! データベース化なんて絶対無理!!!

ちょ、どうしたの!?

SQLこわい……SQLこわい……SQLこわい……(ぶつぶつ)

何のトラウマ!? やめてひたすらSQLSQLつぶやくのやめて!

Tran○ac○-SQLこわい……Or○○leこわい……A○○.N○○こわい……○○○○○○こわい……

具体的なソフトウェア名やライブラリ名はもっとダメーーー!!
いろいろな方面に問題が出るから!


落ち着いた?

うん、もう大丈夫だよ!

今のやりとりの後にそんな笑顔で言われても、普通に恐怖しか沸いてこないんだけど……。

さて、データベース化の話に戻るんだけど。
最近は、Rubyでデータベースを扱うなら
SequelActiveRecordなんかがあるから、きっとるびくるが思ってるほど、つらい道のりではないと思うよ。

え、その「Sequel」や「ActiveRecord」ってなに?

簡単に言うと、データベースを扱いやすくするためのツールキット(ライブラリ)だよ。

有名どころで言うと、Ruby on Railsがデータベースにアクセスするときに
さっき名前の挙がったActiveRecordを使ってるんだけど、聞いたことないかな?

うーん、ActiveRecordの名前くらいなら聞いたことがあるんだけど……
わたし、どういうものなのかよく知らないんだよね−。

そっか。それじゃ、今回はデータベース編ということにして
るびくるのSQLへの苦手意識を、少しでも無くすために
人気のあるデータベースツールキットの1つ「Sequel」について、解説していこうか。

……ところでるびくる、さっきからるびくるがどの発言でもずーっと笑顔のままなのが地味に怖いんだけど……。

やだなあRB、わたしはいつも通りだよ!
マスコットキャラクターの一員として、常に笑顔を絶やさないのは当たり前だって!

無闇やたらにいい笑顔を振りまかれても、引くよ。


1. Sequelを使うとうれしいこと

でも、そのSequelっていったいどんなものなの?
そのSequelっていうソフトウェアを使うだけで、わたしのこのSQLへの闇よりも深き憎しみ
どうにかなるの?

本当にそこまでの憎しみなら、さすがにちょっと難しいかもしれないけど……

少なくとも、直接SQL文を実行していろいろやるのと比べれば
データベースを使うのが、すごく楽になるのは間違いないと思うよ。

え!? Sequelってデータベースを使うのに、SQL文を書く必要がないの!?

うん。もちろん書くこともできるんだけど
Sequelを使うと、普通にデータベースを扱うだけであれば、ほとんどSQL文を書かなくてもいい。
Rubyスクリプトでいろいろやるだけで、データを取得したり、保存したり、検索・集計したり
テーブルを定義したりすることもできるんだ。

「テーブルを定義したりすることもできる」……ってことは、CREATE TABLE文を書く必要さえないの?

うん、ないよ。
書く必要があるのは、せいぜい複雑な集計をやったりするときくらいだね。

最近ではそういう技術は、Rubyに限らず、ほかのプログラミング言語でも割とハヤリで
Microsoftが作ってる.NETフレームワークでも、Entity FrameworkやLINQといった技術を使って
似たようなところを目指してたりするんだよ。

うーん……今まで「データベース=SQL」な印象しかなかったから
いきなり「SQL書かなくていい!」って言われても、あんまりイメージがわかないなあ……。
RB、もしかして怪しいセールスマンみたいなトークを始めようとしてない?

失礼な! 変な壺もなにも買わせる気はないよ!

もしくは「僕と契約してマスコットになってよ!」とかそんなことを……

マスコットも魔法少女もならなくていいから。
とにかく、これからSequelがどんなものか説明していくよ。


2. Sequelはどうやってデータベースからデータを取得するの?

まず前提として、Sequelには、大きくわけて次の2つの使い方がある。

  1. Rubyスクリプトの中から、Sequelを読み込んで使う(ライブラリとして使う)
  2. 「sequel」コマンドから使う(コマンドラインツールとして使う)

    ここではまず、1の「Rubyスクリプトの中から、Sequelを読み込んで使う」やり方に絞って説明していくよ。

はーい。

たとえば、Rubyで何かのデータベースにアクセスして、データをとってきたいとするよね。
データベースの種類は、MySQLでもPostgreSQLでもなんでもいいんだけど……
るびくるはそんなとき、どういうコードを書くってイメージしてる?

うーん、わたしのイメージだとこんな感じかなぁ。

file: sql_select_sample.rb

# 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を使って書き換えると、こうなる。

file: sequel_select_sample.rb

# 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文を書いてないし、それになんだかデータ取得部分の処理がちょっと違うね。
このSequelを使った側のスクリプトでは、どんな風にデータを取得してるの?

OK。2つのスクリプトを、順に比較して解説していこうか。


それじゃこの続きは年明け公開予定の「パート2:概要編・後半」に、こうご期待!

え、ちょっと待って、ここでパート1終了なの!? すごい中途半端っていうかキリ悪くない!?
わたしまだコード書いてないし、Sequelの魅力について何一つ教えてもらってな

それではみなさん、よいお年を!

2012年の大みそかをこんなもどかしい気持ちで迎えるのはいやだーー!!

パート2:概要編・後半に続きます。

このエントリーをはてなブックマークに追加

注意事項
  • 本記事内で使用しているアイコン画像は、桜去ほとりさんが制作されたものです。クリエイティブ・コモンズ 表示-非営利 3.0ライセンスのもとで、再配布や変更などを行っていただくことができます。
  • 本記事内の文章やソースコードは、CC0ライセンスのもとで、ご自由に利用していただくことができます。
  • ツンツク・モモコのお買い物大作戦と形式が類似していますが、本記事側が一方的に参考にさせていただいただけであり、とくに関連性はありません。

一言メッセージフォーム

るびくるへの質問や、やってほしい企画のリクエスト、Webサイト管理スタッフへの感想・意見・質問など、なんでもお気軽にどうぞ。