2015年3月9日月曜日

railsでfind_each使った時にはまった件

railsでバッチ処理を書いててfind_eachを使おうとしたらエラーではまった時にやったことです。

まず最初はこんな感じのテーブルにしていました。
mysql> desc mail_send_targets;
+-------------+------------+------+-----+---------+-------+
| Field       | Type       | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+-------+
| user_id     | bigint(20) | NO   | MUL | NULL    |       |
| item_id     | bigint(20) | NO   | MUL | NULL    |       |
| expire_date | datetime   | NO   |     | NULL    |       |
+-------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

このテーブルに対して、こういうコードを書いたところ、実行したらエラーがでました。
targets = MailSendTarget.where(item_id: item_id)
targets.find_each(batch_size: 2000) do |target|
  #処理
end

ERROR -- : Mysql2::Error: Unknown column 'mail_send_targets.' in 'order clause': SELECT  `mail_send_targets`.* FROM `mail_send_targets`  WHERE `mail_send_targets`.`item_id` = 96  ORDER BY `tmp_mail_send_targets`.`` ASC LIMIT 2000 (ActiveRecord::StatementInvalid)

エラーの内容を見ていくと、ORDER BYのカラムが指定されていなくて、
どうやらprimary keyをorder byに指定するようなので、
テーブルにprimary keyを設定する必要がありそうです。
mysql> desc mail_send_targets;
+-------------+------------+------+-----+---------+-------+
| Field       | Type       | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+-------+
| id      | bigint(20) | NO   | PRI | 0       |       |
| user_id     | bigint(20) | NO   | MUL | NULL    |       |
| item_id     | bigint(20) | NO   | MUL | NULL    |       |
| expire_date | datetime   | NO   |     | NULL    |       |
+-------------+------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

プライマリーキーを設定したところ、エラーが起こらずに処理が流れるようになりました。

2 件のコメント:

  1. このコメントは投稿者によって削除されました。

    返信削除
  2. このコメントは投稿者によって削除されました。

    返信削除