运维开发网

ruby-on-rails – 强制$rake db:重置尽管其他用户使用Postgres

运维开发网 https://www.qedev.com 2020-08-07 13:39 出处:网络 作者:运维开发网整理
参见英文答案 > Rails + Postgres drop error: database is being accessed by other users                                    13个 有没有办法强制数据库重置,即使Postgres有其他用户使用它.当我尝试$rake db时,我几乎总是遇到这个错误:reset: Couldn't drop ex
参见英文答案 > Rails + Postgres drop error: database is being accessed by other users                                    13个

有没有办法强制数据库重置,即使Postgres有其他用户使用它.当我尝试$rake db时,我几乎总是遇到这个错误:reset:

Couldn't drop example_database_name :
 #<ActiveRecord::StatementInvalid: PG::Error: ERROR:  database "example_database_name" is being accessed by other users DETAIL: 
 There are 2 other session(s) using the database.
如果您发现自己在开发中使用了db:reset,那么将它放在lib / database.rake文件中.

require 'active_record/connection_adapters/postgresql_adapter'
module ActiveRecord
  module ConnectionAdapters
    class PostgreSQLAdapter < AbstractAdapter
      def drop_database(name)
        raise "Nah, I won't drop the production database" if Rails.env.production?
        execute <<-SQL
          UPDATE pg_catalog.pg_database
          SET datallowconn=false WHERE datname='#{name}'
        SQL

        execute <<-SQL
          SELECT pg_terminate_backend(pg_stat_activity.pid)
          FROM pg_stat_activity
          WHERE pg_stat_activity.datname = '#{name}';
        SQL
        execute "DROP DATABASE IF EXISTS #{quote_table_name(name)}"
      end
    end
  end
end

显然只是设计用于非生产数据库.它将导致所有现有数据库连接被切断,因此如果unicorn / passenger / pow正在汇集数据库连接,则下一页加载可能会出错.如果发生这种情况,简单的页面刷新将导致服务器打开一个新连接,一切都会很好.

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号