2013-08-16 24 views
2

我需要從ruby腳本(Rails應用程序之外)運行'rake db:drop'console命令。一般來說,看起來很簡單:從Ruby腳本中刪除Rails應用程序的數據庫,在應用程序之外

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

但問題是我下RVM地獄,當我做cd /my/path它不會加載正確的寶石和環境,這就是爲什麼作爲結果,我有

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

此外,由於Rails應用程序正在運行,因此我有打開的連接問題。

它是如何做到的?我的全球任務是關閉現有的數據庫連接(我們可能有一些,因爲我需要放棄運行軌應用程序數據庫),放下它,然後再次重新創建)

謝謝!

+0

你爲什麼不叫'rvm use @ yourgemset'? –

+0

@JustinD。因爲rvm本身的正確環境不會被加載(例如,沒有zsh/bach rc會被執行) –

回答

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 
+0

該死的,看起來像是有效的!謝謝!! –

+0

你能解釋一下它是如何工作的嗎?它只會殺死特定的數據庫連接,而其他數據庫會繼續工作? –

+0

提前致謝! –

1

要在Rails 4中刪除PostgreSQL db,您還可以修補ActiveRecord drop方法。基於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 
相關問題