Sequelにbooleanを渡すと=ではなくIS比較になる

  • このエントリーをはてなブックマークに追加

RubyのSequelというライブラリのお話。 mysql=5.5.42 sequel=4.25.0

db[:log_delay].where(:send_dg => false).order(:event_at).limit(1000).all

こんな処理を書いていて、なんか遅いなー(state=Sorting resultで詰まっている)と思ったら、以下のSQLに変換されていました。

SELECT * FROM `log_delay` WHERE (`send_dg` IS FALSE) ORDER BY `event_at` LIMIT 1000

IS FALSE..だと!? なお、インデックスは send_dgenvet_atに付けています。

本来発行したいSQLは以下です。

SELECT * FROM `log_delay` WHERE (`send_dg` = false) ORDER BY `event_at` LIMIT 1000

こう書いたら目的通りのSQLが生成されました。

db[:log_delay].where(:send_dg => Sequel.lit('false')).order(:event_at).limit(1000).all

そして詰まりも無くなりました。