Ruby on rails 在Heroku上,如何安排定期重置Rails应用程序的postgres数据库?
我正在运行一个小的演示站点。我想大约每小时重置一次数据库(自动,而不是手动)。我可以编写一个rake任务来销毁每个模型的记录。有没有更简单的方法Ruby on rails 在Heroku上,如何安排定期重置Rails应用程序的postgres数据库?,ruby-on-rails,postgresql,heroku,Ruby On Rails,Postgresql,Heroku,我正在运行一个小的演示站点。我想大约每小时重置一次数据库(自动,而不是手动)。我可以编写一个rake任务来销毁每个模型的记录。有没有更简单的方法 如何最好地实现这一点?rake db:schema:load实现了您想要的功能,尽管我从未尝试在Heroku上运行它 您也可以尝试gem,它通常用于测试环境。rake db:schema:load实现了您想要的功能,尽管我从未尝试在Heroku上运行它 您也可以尝试gem,它通常用于测试环境。请参考此链接,了解如何在heroku上自动执行rake任务
如何最好地实现这一点?rake db:schema:load实现了您想要的功能,尽管我从未尝试在Heroku上运行它
您也可以尝试gem,它通常用于测试环境。rake db:schema:load实现了您想要的功能,尽管我从未尝试在Heroku上运行它
您也可以尝试gem,它通常用于测试环境。请参考此链接,了解如何在heroku上自动执行rake任务 您的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
请参考此链接以了解如何在heroku上自动执行rake任务 您的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
尝试运行rake db:setup。
但您需要随时手动运行它。尝试
heroku运行rake db:setup
。
但是,您需要随时手动运行它。您可以使用它来安排rake任务。如果您使用heroku run运行rake任务,那么它也可以与调度程序一起运行。您可以使用来调度rake任务。如果您使用heroku run运行rake任务,那么它也可以与scheduler一起运行。通过链接,我能够使其正常运行,尽管与我计划的不完全一样
首先是澄清。要在Heroku上添加scheduler插件,您必须提供您的信用卡号。我仍在了解Heroku平台的方向,但还没有做好准备。因此,我的解决方案在没有调度程序附加组件的情况下工作。相反,它在本地开发环境中作为rake任务运行,并使用heroku工具带在远程应用程序上运行reset命令
如果您希望在Heroku上运行所有操作,我认为这不会起作用,因为您无法在Heroku本身上运行Heroku pg:reset
命令。然而,看起来这个解决方案是可行的
现在来看看我的解决办法
首先,创建以下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
):
如果您想像我一样安排它定期运行,请向本地crontab添加一个作业(这比复制上面的行要复杂一些):
有关设置cron作业以使用rbenv运行rake任务的更多信息,请参阅。下面的链接,我能够实现这一点,尽管并没有完全按照我的计划进行
首先是澄清。要在Heroku上添加scheduler插件,您必须提供您的信用卡号。我仍在了解Heroku平台的方向,但还没有做好准备。因此,我的解决方案在没有调度程序附加组件的情况下工作。相反,它在本地开发环境中作为rake任务运行,并使用heroku工具带在远程应用程序上运行reset命令
如果您希望在Heroku上运行所有操作,我认为这不会起作用,因为您无法在Heroku本身上运行Heroku pg:reset
命令。然而,看起来这个解决方案是可行的
现在来看看我的解决办法
首先,创建以下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
):
如果您想像我一样安排它定期运行,请向本地crontab添加一个作业(这比复制上面的行要复杂一些):
有关设置cron作业以使用rbenv运行rake任务的更多信息,请参阅。您的答案与我的问题最接近。您在回答末尾引用的
build命令
任务似乎对我有用。复制粘贴的代码中的migrate
和restart
命令不相关。调度器gem也是如此(Heroku提供了一个调度器)。如果你想清理这个,我可以确认它有效,我会接受这个。最后,你的回答没有完全回答我的问题。但我投了你一票,因为你帮助我找到了解决办法。你的答案看起来最接近于回答我的问题。您在回答末尾引用的build命令
任务似乎对我有用。复制粘贴的代码中的migrate
和restart
命令不相关。调度器gem也是如此(Heroku提供了一个调度器)。如果你想清理这个,我可以确认它有效,我会接受这个。最后,你的回答没有完全回答我的问题。但我给了你一票,因为你帮我找到了解决办法。