[英]How to drop test and development database in one rake task?
我試圖從一個rake任務中刪除測試和開發數據庫,如下所示:
task :regenerate do
Rails.env = "test"
Rake::Task["db:drop"].invoke
Rails.env = "development"
Rake::Task["db:drop"].invoke
end
測試數據庫已成功刪除。 但是開發數據庫沒有被刪除。
關於如何使這項工作的任何想法?
注意:這是在Rails 3.2.3上
更新:
非常奇怪,但逆轉順序有效:
task :regenerate do
Rails.env = "development"
Rake::Task["db:drop"].invoke
Rails.env = "test"
Rake::Task["db:drop"].invoke
end
到底是怎么回事?!
你可以像這樣寫:
namespace :db do
desc "Database custom drop"
task :mydrop do
system("rake db:drop RAILS_ENV=test")
system("rake db:drop RAILS_ENV=development")
end
end
反轉它確實有效,因為database_tasks.rb
有一些奇怪的代碼:
def each_current_configuration(environment)
environments = [environment]
environments << 'test' if environment == 'development'
configurations = ActiveRecord::Base.configurations.values_at(*environments)
configurations.compact.each do |configuration|
yield configuration unless configuration['database'].blank?
end
end
如果env是development
它總是添加test
。 我解決了想要做一個自定義的情況下db:rebuild
的任務,同時development
和test
運行development
第一,並test
第二。 此外,在運行任務之前,我調用我的set_env
方法,該方法確保設置ActiveRecord::Tasks::DatabaseTasks.env
,如果沒有這個,數據庫連接似乎不會按預期對環境進行離散處理。 我嘗試了所有其他類型的斷開等,但這沒有進一步的代碼。
def set_env(env)
Rails.env = env.to_s
ENV['RAILS_ENV'] = env.to_s
ActiveRecord::Tasks::DatabaseTasks.env = env.to_s
end
在我使用Ruby 2和Rails 3.2.13的系統上,我可以運行rake db:drop
這會丟棄測試和開發數據庫。 現在比搗亂rake任務容易得多
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.