耙中止! ActiveRecord::StatementInvalid:SQLite3::SQLException:没有这样的 table:让 Rake Automation 无法工作
rake aborted! ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: Trouble Getting Rake Automation to Work
我正在制作一个待办事项列表应用程序,我正在尝试实现一项功能,如果待办事项列表项在 7 天后未在该时间段内完成,它将自动删除。我试图在 'whenever' gem 的帮助下使用 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
.
的 table
db/migrate/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 任务中添加了一个打印语句,以帮助更深入地了解事物:
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 automation 运行 并打印出它找不到任何 >= 7 的匹配项天大。
然而,事实并非如此。在自动化我的 rake 任务之前,我通过 运行ning 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"
然而,这让我想知道,这个错误现在是否已减少为某种配置错误?似乎我的 rake 任务是 运行ning 自动执行的,但它没有在正确的位置执行。例如。在我的生产环境中,我的 rake 任务不是 运行ning。
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
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: items: SELECT "items".* FROM "items"
从错误消息中可以看出,items
table 目前在您的数据库中不存在。即使您没有故意删除它,它也会以某种方式被删除。
因此,您应该通过 运行 相应的迁移再次创建 items
table:
bundle exec rake db:migrate
更新
检查您运行执行此抽取任务的RAILS_ENV
。由于出现错误,这意味着您的数据库中不存在 items
table(看起来这是您的生产数据库)。然后,您必须 运行 中的迁移 RAILS_ENV
以创建 items
table 返回:
RAILS_ENV=production bundle exec rake db:migrate
我和这里的其他评论者一样,认为发生了一些有趣的事情,可能不容易理解。
我的建议是尝试 运行ning rake 'db:drop' 然后 'rake db:migrate' 只是为了确保事情如您所想的那样。
如果问题仍然存在,我认为它与 rails 环境有关。您是否在任何地方将环境设置为 'development' 以外的任何值?
如果是这样,要么不要那样做,要么确保你 运行 'RAILS_ENV=production rake db:migrate ' 并可能阅读 rails 指南中的环境。
感谢大家的帮助!为了修复我的 rake 自动化以在开发中工作,事实证明我只需要使用 crontab -e
通过终端登录我的 crontab,然后将我的 rails 环境编辑为 RAILS_ENV=development
.
然后因为我在我的 schedule.rb 文件中使用 Whenever gem,所以我也必须在那里将环境设置为开发:
rake "todo:delete_items", :environment => 'development'
为了在生产环境中正常工作,我使用了 Heroku,我所要做的就是使用 Heroku Scheduler 插件,经过一些配置设置后我就可以正常工作了。
我正在制作一个待办事项列表应用程序,我正在尝试实现一项功能,如果待办事项列表项在 7 天后未在该时间段内完成,它将自动删除。我试图在 'whenever' gem 的帮助下使用 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
.
db/migrate/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 任务中添加了一个打印语句,以帮助更深入地了解事物:
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 automation 运行 并打印出它找不到任何 >= 7 的匹配项天大。
然而,事实并非如此。在自动化我的 rake 任务之前,我通过 运行ning 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"
然而,这让我想知道,这个错误现在是否已减少为某种配置错误?似乎我的 rake 任务是 运行ning 自动执行的,但它没有在正确的位置执行。例如。在我的生产环境中,我的 rake 任务不是 运行ning。
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
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: items: SELECT "items".* FROM "items"
从错误消息中可以看出,items
table 目前在您的数据库中不存在。即使您没有故意删除它,它也会以某种方式被删除。
因此,您应该通过 运行 相应的迁移再次创建 items
table:
bundle exec rake db:migrate
更新
检查您运行执行此抽取任务的RAILS_ENV
。由于出现错误,这意味着您的数据库中不存在 items
table(看起来这是您的生产数据库)。然后,您必须 运行 中的迁移 RAILS_ENV
以创建 items
table 返回:
RAILS_ENV=production bundle exec rake db:migrate
我和这里的其他评论者一样,认为发生了一些有趣的事情,可能不容易理解。
我的建议是尝试 运行ning rake 'db:drop' 然后 'rake db:migrate' 只是为了确保事情如您所想的那样。
如果问题仍然存在,我认为它与 rails 环境有关。您是否在任何地方将环境设置为 'development' 以外的任何值?
如果是这样,要么不要那样做,要么确保你 运行 'RAILS_ENV=production rake db:migrate ' 并可能阅读 rails 指南中的环境。
感谢大家的帮助!为了修复我的 rake 自动化以在开发中工作,事实证明我只需要使用 crontab -e
通过终端登录我的 crontab,然后将我的 rails 环境编辑为 RAILS_ENV=development
.
然后因为我在我的 schedule.rb 文件中使用 Whenever gem,所以我也必须在那里将环境设置为开发:
rake "todo:delete_items", :environment => 'development'
为了在生产环境中正常工作,我使用了 Heroku,我所要做的就是使用 Heroku Scheduler 插件,经过一些配置设置后我就可以正常工作了。