Ruby Sinatra で Web アプリケーションをサクっと作成する際のデータベースアクセスライブラリを探していたところ、Sequelが軽量との評判でサンプルコードも見つかったので使ってみた。
基本的な使い方は、
この辺に記載してあるとおりでしたが、難しいと感じたのは、Assosiations の扱いです。
まず、データベーススキーマのサンプルが README を探しても見当たらない。みじんこ日記:SequelでMigration を参考にしながら、Migrationコードを作成。
class CreatePosts < Sequel::Migration def up create_table :posts do primary_key :id foreign_key :user_id, :table => :users text :title timestamp :created_at timestamp :updated_at end def down drop_table :posts end end
しかしスキーマエラー。いろいろ調べていると、データベース SQLite3 を利用するとうまくいくが、MySQL を利用するとダメ。そこで発行している SQL をみてみると、、、
CREATE TABLE `posts` (`id` integer PRIMARY KEY AUTO_INCREMENT, `user_id` integer, FOREIGN KEY (`users_id`) REFERENCES `users`)
あれ?これはMySQLでは動作しない。REFERENCES `users`(`id`) が正しそう。直すにはどうする?
ドキュメント の foreign_key やら column を読むと、
とあるので、本来ならば補完してくれそうな気がするが、、、悩んでもしかたがないので修正。
class CreatePosts < Sequel::Migration def up create_table :posts do primary_key :id foreign_key :user_id, :table => :users, :key => :id text :title timestamp :created_at timestamp :updated_at end def down drop_table :posts end end
無事、データベースにテーブルが作成されました。
次は、これを利用した関連付け、many to one、one to many、many to many それぞれ試してみたところ。ここにもハマりポイントがあります。
データベース名は名詞複数形で作成され不可算名詞も考慮しないといけないということ。サラッと書かれているので英語が苦手な私には辛いです。。。ドキュメントではAuthorが例に使われているので注意が必要。Sequelを試してみる(3) 関連を使ってみる を参考にするとわかりやすい(感謝!)。
Model生成時にも、単数複数形には注意が必要。
one_to_many :author # これは複数!
many_to_one :author # これは単数
many_to_many :tags # これは複数
これに気がつくのに少しかかった。結果は、、、便利です。SQL ゴリゴリ書いていたのが嘘のよう。だけど、余分なSQLもガシガシ発行してそうな気もしますけど。