スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Sequelとpgでselectしてみた

Sequelで生SQLを書いた時に、どれだけ便利になるのか試してみました。

・SQL
create table t_test(id int, val text);
insert into t_test(id, text) values (1, 'a');

・ruby
require "sequel"
require "pg"

db = Sequel.connect("postgres://user:pass@localhost:5432/test"
conn = PGconn.connect("localhost",5432,"","","test","user","pass")

p db["SELECT *, :intval, :strval, :boolval, :recordval, unnest(:aryval::TEXT[]), NOW() FROM t_test where id = :intval AND val = :strval",
{intval: 1, strval: "a", boolval: true, aryval: "{a,b,c}", recordval: [1, 2, 3]}].all

p conn.exec("SELECT *, $1::BIGINT, $2::TEXT, $3::BOOLEAN, unnest($4::TEXT[]), NOW() FROM t_test where id = $5 AND val = $6",
[1, "a", true, "{a,b,c}", 1, "a"]).to_a

・結果
[{:id=>1, :val=>"a", :"?column?"=>"a", :bool=>true, :row=>"(1,2,3)", :unnest=>"a", :now=>2012-10-05 09:20:18 +0900}, {:id=>1, :val=>"a", :"?column?"=>"a", :bool=>true, :row=>"(1,2,3)", :unnest=>"b", :now=>2012-10-05 09:20:18 +0900}, {:id=>1, :val=>"a", :"?column?"=>"a", :bool=>true, :row=>"(1,2,3)", :unnest=>"c", :now=>2012-10-05 09:20:18 +0900}]

[{"id"=>"1", "val"=>"a", "int8"=>"1", "text"=>"a", "bool"=>"t", "unnest"=>"a", "now"=>"2012-10-05 09:20:18.033258+09"}, {"id"=>"1", "val"=>"a", "int8"=>"1", "text"=>"a", "bool"=>"t", "unnest"=>"b", "now"=>"2012-10-05 09:20:18.033258+09"}, {"id"=>"1", "val"=>"a", "int8"=>"1", "text"=>"a", "bool"=>"t", "unnest"=>"c", "now"=>"2012-10-05 09:20:18.033258+09"}]

違いは3点。
1. Sequelは名前付きのプレースホルダーが使える。
同じパラメーターなら同じ名前で設定できます。ここでは「abc」がそうです。pgの場合$1, $4でわざわざ二回パラメーターを渡さなければなりません。

2. Sequelは型を補完してくれる。
SequelではSELECT句の「intval,strval,boolval」には型が指定してありませんが、渡した値の型で出力されます。
pgではエラーになり::TEXTの用に型を指示してやる必要があります。

3. Sequelは戻ってきた結果が型を反映している
pgではすべて文字列ですが、Sequelではrubyの型に従って変換しています。ちなみにTIMESTAMP型はTimeクラスのインスタンスでした。

ということで、生SQLを書く場合はSequelを使うのがよさげです。
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。