Ispirato da questa risposta
, abbiamo creato il seguente database.rake
file. Laddove la risposta originale funzionava solo per PostgreSQL 9.1, questa è stata modificata per funzionare anche per PostgreSQL 9.2. Il meccanismo non è dei più belli:quando il comando 9.1 fallisce, esegue semplicemente il comando 9.2. Ma la cosa più importante:funziona!
#{Rails.root}/lib/tasks/databases.rake
# monkey patch ActiveRecord to avoid There are n other session(s) using the database.
def drop_database(config)
case config['adapter']
when /mysql/
ActiveRecord::Base.establish_connection(config)
ActiveRecord::Base.connection.drop_database config['database']
when /sqlite/
require 'pathname'
path = Pathname.new(config['database'])
file = path.absolute? ? path.to_s : File.join(Rails.root, path)
FileUtils.rm(file)
when /postgresql/
begin
ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
ActiveRecord::Base.connection.select_all("select * from pg_stat_activity order by procpid;").each do |x|
if config['database'] == x['datname'] && x['current_query'] =~ /<IDLE>/
ActiveRecord::Base.connection.execute("select pg_terminate_backend(#{x['procpid']})")
end
end
ActiveRecord::Base.connection.drop_database config['database']
rescue # in PG 9.2 column procpid was renamed pid and the query status is checked not using 'current_query' but using 'state'
ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
ActiveRecord::Base.connection.select_all("select * from pg_stat_activity order by pid;").each do |x|
if config['database'] == x['datname'] && x['state'] =~ /idle/
ActiveRecord::Base.connection.execute("select pg_terminate_backend(#{x['pid']})")
end
end
ActiveRecord::Base.connection.drop_database config['database']
end
end
end