PerlerのRuby日記

Rubyとか

Sequel3.48でgraph使ったらdeprecated出たので対応した

通常のjoin

Sequelを使って、単純にAテーブルとBテーブルをjoinすると、同名のカラムが存在する場合、右側の方が有効になる。

mysql> select * from a;
+----+------+-------------+
| id | z_id | name        |
+----+------+-------------+
|  1 |  123 | Yamada Taro |
+----+------+-------------+
mysql> select * from b;
+----+------+---------------+
| id | z_id | name          |
+----+------+---------------+
|  1 |  123 | Suzuki Hanako |
+----+------+---------------+
require "sequel"
DB = Sequel.connect("mysql2://user:password@localhost/foo")

class A < Sequel::Model(DB[:a])
end
class B < Sequel::Model(DB[:b])
end

p A.join(B, :z_id => :z_id).sql
#=> "SELECT * FROM `a` INNER JOIN `b` ON (`b`.`z_id` = `a`.`z_id`)"

p A.join(B, :z_id => :z_id).first
# Bの"Suzuki Hanako"が格納されてしまう
#=> [#<A @values={:id=>1, :z_id=>123, :name=>"Suzuki Hanako"}>]

graphを使う

このときjoinの代わりにgraphメソッドを使うと、AもBも両方使えるようになる。

p A.graph(B, :z_id => :z_id).sql
#=> "SELECT `a`.`id`, `a`.`z_id`, `a`.`name`, `b`.`id` AS `b_id`, `b`.`z_id` AS `b_z_id`, `b`.`name` AS `b_name` FROM `a` LEFT OUTER JOIN `b` ON (`b`.`z_id` = `a`.`z_id`)"

p A.graph(B, :z_id => :z_id).first
#=> {:a=>#<A @values={:id=>1, :z_id=>123, :name=>"Yamada Taro"}>, :b=>#<B @values={:id=>1, :z_id=>123, :name=>"Suzuki Hanako"}>}

が、同時にdeprecation warningも出てきた。

SEQUEL DEPRECATION WARNING: Dataset#graph_each is deprecated and will be removed in Sequel 4.0.
Load the graph_each extension if you want to continue using it.

使っていたバージョンは3.48。3系の最後。

4系でも使うためには、いまからextensionに切り出された方を使うのがいいんだろう。


extensionでgraphを使う

DB.extension(:graph_each)

1行追加して終わり。

警告も出なくなった。