【问题标题】:On Heroku, how can I schedule the postgres database for my Rails app to be periodically reset?在 Heroku 上,如何安排我的 Rails 应用程序的 postgres 数据库定期重置?
【发布时间】:2015-06-02 14:04:33
【问题描述】:

我正在运行一个小型演示站点。我想每小时左右重置一次数据库(自动,而不是手动)。我可以编写一个 rake 任务来销毁每个模型的记录。有没有更简单的方法?

如何最好地做到这一点?

【问题讨论】:

    标签: ruby-on-rails postgresql heroku


    【解决方案1】:

    您可以使用Heroku Scheduler 来安排 rake 任务。如果您使用heroku run 运行 rake 任务,那么它也可以与调度程序一起使用。

    【讨论】:

      【解决方案2】:

      请参阅此链接以了解如何在 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
      

      【讨论】:

      • 您的回答看起来最接近回答我的问题。您在答案末尾引用的linkbuild command 任务看起来对我有用。您复制粘贴的代码中的migraterestart 命令无关紧要。与调度程序 gem 一样(Heroku 提供了一个调度程序)。如果你想清理它,我可以确认它有效,我会接受。
      • 最后,您的回答并没有完全回答我的问题。但是我给了你一个支持,因为你帮助我找到了解决方案。
      【解决方案3】:

      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

      【讨论】:

        【解决方案4】:

        rake db:schema:load 完成了你想要的,虽然我从未尝试在 Heroku 上运行它。

        您也可以试试database_cleaner gem,它通常用于测试环境。

        【讨论】:

          【解决方案5】:

          试试heroku run rake db:setup。 但是您必须随时手动运行它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-11-19
            • 1970-01-01
            • 2013-11-17
            • 2016-05-29
            • 2018-07-05
            • 1970-01-01
            • 2012-11-02
            相关资源
            最近更新 更多