从应用程序之外的Ruby脚本中删除Rails应用程序的数据库

时间:2013-08-16 13:58:25

标签: ruby ruby-on-rails-3 rvm

我需要从ruby脚本(在Rails应用程序之外)运行'rake db:drop'控制台命令。通常看起来很简单:

system("cd /my/path && rake db:drop")

但问题是我在rvm地狱,当我正在做cd /my/path它没有加载正确的宝石集和环境,这就是为什么我的结果

Could not find activesupport-3.1.12 in any of the sources
Run `bundle install` to install missing gems

此外,由于Rails应用程序正在运行,我遇到了打开连接问题。

怎么做? (我的全局任务是关闭与数据库的现有连接(我们可能有一些,因为我需要删除运行的rails app数据库),删除它,然后再次重新创建)

谢谢!

2 个答案:

答案 0 :(得分:1)

要杀死活动连接,我在rake任务中使用它。这应该解决一个问题。

task :kill_postgres_connections => :environment do
  db_name = "#{File.basename(Rails.root)}_#{Rails.env}"
  sh = <<EOF
ps xa \
  | grep postgres: \
  | grep #{db_name} \
  | grep -v grep \
  | awk '{print $1}' \
  | xargs kill
EOF
  puts `#{sh}`
end

task "db:drop" => :kill_postgres_connections

答案 1 :(得分:1)

要在Rails 4中删除PostgreSQL数据库,您还可以修补ActiveRecord drop方法。基于https://www.krautcomputing.com/blog/2014/01/10/how-to-drop-your-postgres-database-with-rails-4/

# config/initializers/postgresql_database_tasks.rb

module ActiveRecord
  module Tasks
    class PostgreSQLDatabaseTasks

      def drop
        establish_master_connection
        connection.select_all "select pg_terminate_backend(pg_stat_activity.pid) from pg_stat_activity where datname='#{configuration['database']}' AND state='idle';"
        connection.drop_database configuration['database']
      end
    end
  end
end