耙子流产了! ActiveRecord :: StatementInvalid:SQLite3 :: SQLException:没有这样的表:麻烦让Rake Automation工作

时间:2015-08-26 05:08:54

标签: ruby-on-rails ruby activerecord sqlite whenever

我正在制作一个待办事项列表应用程序,我正在尝试实现一个功能,如果在该时间段内从未完成待办事项列表项,将在7天后自动删除。我试图在'随时'的宝石的帮助下使用rake自动化但是我收到以下错误:

rake aborted!
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: items: SELECT "items".* FROM "items"  WHERE (created_at <= '2015-08-18 23:26:04.639414') 

这是完整的堆栈跟踪: https://gist.github.com/jlquaccia/0ac0eaa2b1d639fc514e

您还可以在Github here

上查看我最近的提交

我仍然对RoR有点新,并且对错误消息感到困惑,因为我已经创建了一个名为items的表。

分贝/迁移/ 20150817215220_create_items.rb:

class CreateItems < ActiveRecord::Migration
  def change
    create_table :items do |t|
      t.string :name
      t.references :user, index: true

      t.timestamps
    end
  end
end

有人可以帮忙吗?今天我决定在这里询问之前,我已经在这个上旋转了一段时间。

更新

我已完全重置我的数据库,在开发和生产中重新迁移,并重新创建了新的用户和项目。我知道在运行我的rake自动化时会收到更长的错误(这次一切似乎都顺利迁移)。但是,我的rake自动化仍然不起作用..

我回去并在我的rake任务中添加了一个print语句,以帮助深入了解事情:

puts Item.where("created_at <= ?", Time.now - 7.days).inspect

手动运行此任务时,我得到:

输入:rake todo:delete_items

输出:#<ActiveRecord::Relation [#<Item id: 2, name: "Milk", user_id: 1, created_at: "2015-08-24 18:16:25", updated_at: "2015-08-31 18:16:25">]>

这证明rake任务在手动运行时确实有效。

然而,当我去自动完成这项任务时:

schedule.rb:

every :day, :at => '12:09 pm' do
  rake "todo:delete_items"
end

没有任何反应,但我确实在终端收到了一条消息。

Mail version 8.1 6/6/93.  Type ? for help.
"/var/mail/Jason": 1 message 1 new
>N  1 Jason@jason-quaccias  Mon Aug 31 12:09  19/900   "Cron <Jason@jason-quaccias-macbook-pro> /bin/bash -l -c 'cd /Users/Jason/code/projects/blocitoff && RAILS_ENV=production bundle exec rake todo:de"
? 
Message 1:
From Jason@jason-quaccias-macbook-pro.local  Mon Aug 31 12:09:18 2015
X-Original-To: Jason
Delivered-To: Jason@jason-quaccias-macbook-pro.local
From: Jason@jason-quaccias-macbook-pro.local (Cron Daemon)
To: Jason@jason-quaccias-macbook-pro.local
Subject: Cron <Jason@jason-quaccias-macbook-pro> /bin/bash -l -c 'cd /Users/Jason/code/projects/blocitoff && RAILS_ENV=production bundle exec rake todo:delete_items --silent'
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=Jason>
X-Cron-Env: <USER=Jason>
X-Cron-Env: <HOME=/Users/Jason>
Date: Mon, 31 Aug 2015 12:09:15 -0700 (PDT)

#<ActiveRecord::Relation []>

注意邮件的最后一行#<ActiveRecord::Relation []>我可以告诉我,我的rake自动化确实运行并打印出它找不到匹配任何&gt; = 7天的项目。

然而,事实并非如此。在自动执行rake任务之前,我通过运行Heroku rails控制台确保生产中存在超过7天的项目。

irb(main):003:0> u_items.find_by(id: 1)
=> #<Item id: 1, name: "Bread", user_id: 3, created_at: "2015-08-22 22:32:55", updated_at: "2015-08-30 22:32:55">

这很清楚,因为created_at属性读取"2015-08-22 22:32:55"

然而,这让我想知道,这个bug现在已经减少到了某种配置错误吗?好像我的rake任务自动运行但它没有在正确的位置执行。例如。我的rake任务没有在我的生产环境中运行。

environment.rb中:

# Load the Rails application.
require File.expand_path('../application', __FILE__)

# Initialize the Rails application.
Rails.application.initialize!

todo.rake:

namespace :todo do
  desc "Delete items older than seven days"
  task delete_items: :environment do
    # Item.where("created_at <= ?", Time.now - 7.days).destroy_all
    puts Item.where("created_at <= ?", Time.now - 7.days).inspect
  end
end

3 个答案:

答案 0 :(得分:1)

ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: items: SELECT "items".* FROM "items"

从错误消息中可以看出,您的数据库中现在不存在items表。即使你没有故意删除它,它也会以某种方式被删除。

因此,您应该通过运行相应的迁移来再次创建items表:

bundle exec rake db:migrate

更新

检查您正在运行此rake任务的RAILS_ENV。由于错误显示,这意味着您的数据库中没有items表(看起来它是您的生产数据库)。然后,您必须在RAILS_ENV中运行迁移以创建items表:

RAILS_ENV=production bundle exec rake db:migrate

答案 1 :(得分:1)

我和其他评论者在一起,认为发生了一些可能不容易理解的有趣事。

我的建议是尝试运行rake&#39; db:drop&#39;然后&#39; rake db:migrate&#39;只是为了确保事情就像你认为的那样。

如果问题仍然存在,我希望它与rails环境有关。您是否将环境设置为“开发”以外的任何其他环境?任何地方?

如果是这样,或者不这样做,或者,确保你运行&#39; RAILS_ENV =生产rake db:migrate&#39;并且可能会阅读导轨指南中的环境。

答案 2 :(得分:0)

感谢大家的帮助!为了修复我的rake自动化以便在开发中工作,事实证明我只需通过终端crontab -e登录我的crontab,然后将我的rails环境编辑为RAILS_ENV=development

然后因为我在使用Whenever gem,在我的schedule.rb文件中,我不得不将环境设置为那里的开发:

rake "todo:delete_items", :environment => 'development'

为了让生产工作正常,我使用Heroku,我所要做的就是使用Heroku Scheduler插件,我可以在配置一些设置后让事情正常工作。