【发布时间】:2015-06-02 14:04:33
【问题描述】:
我正在运行一个小型演示站点。我想每小时左右重置一次数据库(自动,而不是手动)。我可以编写一个 rake 任务来销毁每个模型的记录。有没有更简单的方法?
如何最好地做到这一点?
【问题讨论】:
标签: ruby-on-rails postgresql heroku
我正在运行一个小型演示站点。我想每小时左右重置一次数据库(自动,而不是手动)。我可以编写一个 rake 任务来销毁每个模型的记录。有没有更简单的方法?
如何最好地做到这一点?
【问题讨论】:
标签: ruby-on-rails postgresql heroku
您可以使用Heroku Scheduler 来安排 rake 任务。如果您使用heroku run 运行 rake 任务,那么它也可以与调度程序一起使用。
【讨论】:
请参阅此链接以了解如何在 heroku 上自动执行 rake 任务 http://kakimotonline.com/2014/04/27/using-rake-to-automate-heroku-tasks/
您的 rake 文件将如下所示:
namespace :heroku do
def run_command(cmd, app_name)
Bundler.with_clean_env do
sh build_command(cmd, app_name)
end
end
def build_command(cmd, app_name)
"heroku #{cmd} --app #{app_name}"
end
end
【讨论】:
build command 任务看起来对我有用。您复制粘贴的代码中的migrate 和restart 命令无关紧要。与调度程序 gem 一样(Heroku 提供了一个调度程序)。如果你想清理它,我可以确认它有效,我会接受。
在Akshay 链接的the example 之后,我能够得到这个工作,虽然不完全按照我的计划。
首先,澄清一下。要在 Heroku 上添加调度程序插件,您必须提供您的信用卡号。我仍然对 Heroku 平台有所了解,还没有准备好这样做。所以我的解决方案在没有调度程序插件的情况下工作。相反,它从您的本地开发环境作为 rake 任务运行,并使用 heroku 工具带在您的远程应用程序上运行重置命令。
如果您希望在 Heroku 上运行所有内容,我认为这不会起作用,因为您无法在 Heroku 本身上运行 heroku pg:reset 命令。但是,看起来这个解决方案 here 可以工作。
现在我的解决方案。
首先,创建以下 rake 文件:
# lib/tasks/heroku.rake
namespace :heroku do
# bundle exec rake heroku:reset_db['my-app-name']
# Note: run locally with Heroku toolbelt to reset DB on app
desc 'Reset database with seed data'
task :reset_db, [:app_name] do |t, args|
run_command("pg:reset DATABASE_URL --confirm #{args.app_name}", args.app_name)
run_command("run rake db:migrate", args.app_name)
run_command("run rake db:seed", args.app_name)
end
# Helper Functions
# Source: http://kakimotonline.com/2014/04/27/using-rake-to-automate-heroku-tasks/
def run_command(cmd, app_name)
Bundler.with_clean_env do
sh build_command(cmd, app_name)
end
end
def run_command_with_output(cmd, app_name)
Bundler.with_clean_env do
`#{build_command(cmd, app_name)}`
end.gsub("\n", "")
end
def build_command(cmd, app_name)
"heroku #{cmd} --app #{app_name}"
end
end
现在您可以通过在本地环境中使用您的应用名称运行以下 rake 命令来重置数据库(运行 heroku apps 作为您的应用名称):
bundle exec rake heroku:reset_db['my-app-name']
如果您想像我一样安排它定期运行,请将作业添加到本地 crontab(这比仅复制上面的行要复杂一些):
# Reset Heroku database hourly
RBENV_SHIM=/home/klenwell/.rbenv/shims/
RBENV_BIN=/home/klenwell/.rbenv/bin
RAILS_APP=/home/klenwell/projects/my-app-name
HEROKU_LOG=/tmp/heroku-cron.log
0 * * * * export PATH=$RBENV_SHIM:$RBENV_BIN:$PATH; eval "$(rbenv init -)"; cd $RAILS_APP && bundle exec rake heroku:reset_db['my-app-name'] >> $HEROKU_LOG 2>&1
有关设置 cron 作业以使用 rbenv 运行 rake 任务的更多信息,请参阅this article。
【讨论】:
rake db:schema:load 完成了你想要的,虽然我从未尝试在 Heroku 上运行它。
您也可以试试database_cleaner gem,它通常用于测试环境。
【讨论】:
试试heroku run rake db:setup。
但是您必须随时手动运行它。
【讨论】: