簡體   English   中英

如何在一個rake任務中刪除測試和開發數據庫?

[英]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的任務,同時developmenttest運行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

這是我的完整db.rake文件的要點,同時具有多環境db:rebuilddb:truncate

在我使用Ruby 2和Rails 3.2.13的系統上,我可以運行rake db:drop

這會丟棄測試和開發數據庫。 現在比搗亂rake任務容易得多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM