graphがあったぜSequel

Sequelのjoinの戻り値がどう…というエントリを書いてうだうだ言っていたが、graphというメソッドを使えば一件落着?

[pyg language=”ruby”]
#! /usr/bin/ruby

require ‘sequel’
require ‘pp’

DB=Sequel.sqlite

DB.create_table :tbl1s do
primary_key :id
String :value
end

DB.create_table :tbl2s do
primary_key :id
String :value2
Integer :tbl1_id
end

class Tbl1 < Sequel::Model ; end class Tbl2 < Sequel::Model ; end if $0==__FILE__ Tbl1.insert(:value=>“tbl1data1″) # tbl1s.id=>1
Tbl1.insert(:value=>”tbl1data2″) # tbl1s.id=>2
Tbl2.insert(:value2=>”tbl2data1″, :tbl1_id=>2) # tbl2s.id=>1
Tbl2.insert(:value2=>”tbl2data2″, :tbl1_id=>1) # tbl2s.id=>2
# SELECT * FROM tbl1s INNER JOIN tbl2s ON (tbl2s.tbl1_id = tbl1s.id)
t1=Tbl1.join(Tbl2, :tbl1_id=>:id).first
pp t1 # Tbl1{:id=>1, :value=>”tbl1data2″, :value2=>”tbl2data1″, :tbl1_id=>2}
t2=Tbl1.graph(Tbl2, :tbl1_id=>:id).first
pp t2 # Tbl1{:id=>1, :value=>”tbl1data1″, :tbl2s_id=>2, :value2=>”tbl2data2″, :tbl1_id=>1}
end
[/pyg]

重複するカラム名はTbl1側が普通に使われ、Tbl2側のカラム名は「テーブル名_カラム名」になる。重複しなければそのまま使える。モデルのクラスはTbl1側。joinがこの仕様だったら良かったんだ。

しかしSQL文を見ると、graphメソッドはLEFT OUTER JOINですね。joinメソッドはINNTER JOINですから、当然結果は異なるわけで、joinは両方にデータがなければ出てこず、graphはTbl1にデータがあれば出てくる。

[pyg language=”ruby”]
Tbl1.insert(:value=>”tbl1data3″) # tbl1s.id=>3
Tbl1.join(Tbl2, :tbl1_id=>:id).count # 2(INNNER JOIN)
Tbl1.graph(TBl2, :tbl1_id=>:id).count # 3(LEFT OUTER JOIN)
Tbl1.left_outer_join(Tbl2, :tbl1_id=>:id).count # 3(LEFT OUTER JOIN)
[/pyg]

これまでの結論:やっぱSequelのjoin()の仕様はおかしい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です