2

我需要从 ruby​​ 脚本(在 Rails 应用程序之外)运行“rake db:drop”控制台命令。一般来说,它看起来很简单:

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

但问题是我在 rvm 地狱下,当我这样做cd /my/path时没有加载正确的 gemset 和环境,这就是为什么我有

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

此外,我有打开连接问题,因为 Rails 应用程序正在运行。

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

谢谢!

4

2 回答 2

1

要在 Rails 4 中删除 PostgreSQL 数据库,您还可以修补 ActiveRecord 删除方法。基于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
于 2015-03-30T10:36:11.577 回答
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
于 2013-08-16T14:08:26.643 回答