Skip to main content

ログ取得ツール (移転先予定地)

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()の仕様はおかしい。