我有一个运行在Postgres上的rails应用程序.

我有两台服务器:一台用于测试,另一台用于生产.

我经常需要在测试服务器上克隆生产数据库.

我通过Vlad运行的命令是:

rake RAILS_ENV='test_server' db:drop db:create

我遇到的问题是,我收到了以下错误:

ActiveRecord::StatementInvalid: PGError: ERROR: database <database_name> is being accessed by other users DROP DATABASE IF EXISTS <database_name>

如果最近有人通过网络访问了应用程序,就会发生这种情况(postgres会打开一个"会话")

有没有办法终止postgres DB上的会话?

非常感谢.

编辑

我可以使用phppgadmin的界面删除数据库,但不能使用rake任务.

如何用耙子任务复制phppgadmin的下落?

推荐答案

如果你可以删除你的应用程序的SQL连接,那么你可以删除你的应用程序的SQL连接.那么如何消除这些联系呢?我使用以下rake任务:

# lib/tasks/kill_postgres_connections.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

从rails下删除连接有时会导致下次try 加载页面时它呕吐,但再次重新加载会重新建立连接.

Ruby-on-rails相关问答推荐

ActiveAdmin:的呈现索引表在父级的显示页中有许多资源

会话控制器中的某种问题

has_many 通过大小验证

序列化来自关联的不可变数据是个好主意吗?

如何保持 en.yml DRY?

在 Datatable Ajax 调用中通过 Ajax 更新 div

有没有办法在 Rails 3.1 中检测用户代理

rails:防止闪烁消息显示两次

简单表单关联自定义标签名称

是否可以在 Rails 集成测试或规范中指定用户代理?

在 ID 存在时获取表的未知主键

如何让空白复选框作为假传递给参数

Ruby on Rails 中的MySQL 服务器已经消失

嵌套模型和父验证

Rails 4 pgsql add_index 类型为 GIN 或 GiST

Rails Devise:设置密码重置令牌并重定向用户

Post.all.map(&:id) 是什么意思?

列出关联模型的名称

Rails:在 link_to 中保留 GET 查询字符串参数

在 Rails 中显示主机名和数据库名