Sequel を試してみた

スポンサーリンク

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 を読むと、

“:key – For foreign key columns, the column in the associated table that this column references. Unnecessary if this column references the primary key of the associated table.”

とあるので、本来ならば補完してくれそうな気がするが、、、悩んでもしかたがないので修正。

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もガシガシ発行してそうな気もしますけど。

タイトルとURLをコピーしました