3

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.
4

2 に答える 2

5

開発で頻繁にlib/database.rake使用する場合は、これをファイルに入れてください。db:reset

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 がデータベース接続をプールしている場合、次のページの読み込みでエラーが発生する可能性があります。これが発生した場合、単純なページの更新により、サーバーが新しい接続を開き、すべてがうまくいきます。

于 2013-03-31T12:31:41.567 に答える