読者です 読者をやめる 読者になる 読者になる

PerlerのRuby日記

Rubyとか

Sequelのカラム名にはシンボルを使うこと

Ruby

http://sequel.rubyforge.org/rdoc/files/README_rdoc.html

Column references in Sequel

Sequel expects column names to be specified using symbols.

はまったのでメモ。


条件に沿って"field1", "field2"のようなフィールドにアクセスするときに

間違ってもStringでSequelのwhereとかselectとかに渡してはいけない。


そのまま「文字列」として処理されてしまう。

mysql> select * from foo;
+------+------------+-----------------+
| id   | field1     | field2          |
+------+------------+-----------------+
|    1 | fooooo!!!! | FOOOOOOO!??!?!? |
+------+------------+-----------------+
1 row in set (0.00 sec)
$ sequel mysql2://user:password@localhost/hoge

2.0.0-p247 :001 > puts DB[:foo].select("field1").sql
SELECT 'field1' FROM `foo`
 => nil
# ↑field1はバッククオートではなくシングルクオート、つまり文字列!

2.0.0-p247 :002 > puts DB[:foo].select("field1").all
{:field1=>"field1"}
 => nil
# ↑得られる結果も当然そのまま!

2.0.0-p247 :003 > puts DB[:foo].select(:field1).sql
SELECT `field1` FROM `foo`
 => nil

2.0.0-p247 :004 > puts DB[:foo].select(:field1).all
{:field1=>"fooooo!!!!"}
 => nil
# ↑本当はこうしないといけなかった!

2.0.0-p247 :005 > num = 1
 => 1

2.0.0-p247 :006 > puts DB[:foo].select(:"field#{num}").sql
SELECT `field1` FROM `foo`
 => nil

2.0.0-p247 :007 > puts DB[:foo].select(:"field#{num}").all
{:field1=>"fooooo!!!!"}
 => nil
# ↑動的に作る場合ももちろんシンボルにすること!