簡體   English   中英

Capistrano deploy:migrate和db:migrate每次都運行所有遷移

[英]Capistrano deploy:migrate and db:migrate run all migrations every time

因此,我在使用rails(紅寶石1.9.3p392,rails 3.2,sqlite3 db),並嘗試將無處不在的博客教程代碼部署到“生產”服務器(apache,passenger,ubuntu)。 我的deploy.rb看起來像這樣:

require 'bundler/capistrano'
require 'rvm/capistrano'
load 'deploy/assets'
set :rvm_ruby_string,  ENV['GEM_HOME'].gsub(/.*\//,"")
set :rvm_type, :user
set :user, 'blah'
set :application, 'railsTest'
set :domain, 'www.blah.com'
set :applicationdir, "/home/sean/public/blah.com/public"
set :scm, 'git'
set :repository,  "ssh://blah@1.1.1.1/home/blah/public/bla.com/public/capDep.git"
#set :git_enable_submodules, 1 # if you have vendored rails
set :branch, 'master'
set :git_shallow_clone, 1
set :scm_verbose, true
set :use_sudo, false


# roles (servers)
role :web, domain
role :app, domain
role :db,  domain, :primary => true

# deploy config
set :deploy_to, applicationdir
set :deploy_via, :export
set :migrate_target, :latest
# additional settings
default_run_options[:pty] = true  # Forgo errors when deploying from windows
#ssh_options[:keys] = %w(/home/blah/.ssh/id_rsa)
ssh_options[:forward_agent] = true
# if you want to clean up old releases on each deploy uncomment this:

# If you are using Passenger mod_rails uncomment this:
namespace :deploy do
  task :start do ; end
  task :stop do ; end
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
  end
end

#after "deploy:update_code", "deploy:migrate"

現在,我敢肯定,對於那些知道自己在用Capistrano做什么的人來說,一定看起來像是一個巨大的混亂局面,但我可真是一頭霧水。 最后,盡管我有不足之處,但部署似乎仍然有效,因為當我運行以下命令時

cap deploy:setup
cap deploy

我的應用程序已啟動並正在運行,正因為我可以,所以我通過Rails為我創建的Web ui向數據庫中的表添加了幾行。 現在,我大膽地創建遷移,在表中添加一列。 我將更改推送到git。 令我恐懼的是,當我跑步時

cap deploy

運行所有遷移,這將重新創建表,從而破壞了我的所有數據。 我已經多次重復了這個痛苦的過程。 我的schema_migrations表如下所示:

20130620210004
20130620220229
20130628213331
20130628214946
20130628223002

我在這里想念什么?

更新:我最近給出了@TheMahrvin的建議,關於在命令行上運行deploy:migrations並將其從deploy.rb中刪除。 它沒有用...再次運行所有遷移。 我的繆斯女神一定在耳邊竊竊私語,因為我決定嘗試在服務器本身上運行db:migrate。 運行“ rake”后,我驚訝地看到以下輸出:

  20130717230110 CreateHighScores
  20130717230342 CreateGames
  20130717231041 AddGameTypeToGame
  20130717233707 AddGamePublisherToGame
  20130717234124 AddGameRatingToGame
  20130731210558 AddGameMechanicToGame

僅最后的遷移應處於掛起狀態。 因此,Capistrano也許根本不是問題(我已經更新了此問題的標題以反映這一點)。 那么,為什么以前的遷移仍被標記為待處理? 我知道它們是過去運行的,都是因為我在輸出中看到了它們並在它們運行后驗證了數據庫模式。

更新#2:設置另一個遷移並ssh'd到服務器,然后將其cd引導到“當前”目錄,如果我完全了解capistrano,那么就可以找到當前文件。 跑步

bundle exec rake db:migrate:status

得到我:

 Status   Migration ID    Migration Name
--------------------------------------------------
  down    20130717230110  Create high scores
  down    20130717230342  Create games
  down    20130717231041  Add game type to game
  down    20130717233707  Add game publisher to game
  down    20130717234124  Add game rating to game
  down    20130731210558  Add game mechanic to game
  down    20130731212454  Add publish year to game
  down    20130731214515  Add game rank to game
  down    20130731214928  Add game abbr to game
  down    20130731215749  Add crazy field to game

我忍不住感覺到我要做的事情有嚴重的錯誤。

好的,弄清楚了...盡管在我最初的問題中,堆疊圈中的其他任何人都應該基於紅鯡魚來做同樣的事情,但這超出了我的范圍。

問題是我的生產數據庫設置為

db/production.sqlite3

因為它是主項目目錄中的一個sqlite數據庫,所以每次我運行時它都會被刪除

cap deploy

那我什么時候跑

cap deploy:migrate

它將找到一個空數據庫,並認為需要運行所有遷移。 我通過將數據庫路徑更改為

/my_absolute_path/shared/db/production.sqlite3

感謝@TheMahvin和其他任何試圖承擔回答我措辭不佳的問題的絕望任務的人!

對這個問題的提問,使秤從我的眼前跌落:

Capistrano部署擦除數據庫嗎?

我還沒看到:

after "deploy:update_code", "deploy:migrate"

之前。 嘗試刪除該行並運行:

 bundle exec cap deploy:migrations (deploys code and migrations)

要么

 bundle exec cap deploy:migrate (runs the migrate rake task on the server)

代替。 盡管我對rvm / capistrano集成或Windows調整一無所知,但是其余的deploy.rb在我看來似乎還可以。

您如何“向數據庫中的表添加幾行”?
我懷疑您的數據丟失是由於混合遷移和您自己的數據庫更改引起的。 Rails希望您通過遷移進行所有數據庫更改。
在Rails社區中,關於遷移的爭論頗多,但是現在(尤其是初學者的時候)總是使用遷移來更改數據庫。 這樣一來,您便擁有了數據庫的完整藍圖,可讓您從頭開始在多台計算機上進行部署,而無需擺弄數據庫,並確保其他貢獻者可以使用相同的數據庫。

我對這些內部知識不了解很多,但是據我了解,您的數據丟失導致了以下情況:

手動更改后,Rails無法將db-layout與任何遷移的結果相匹配(分別通過遷移和方案中的時間戳記),因此將db視為新數據庫。 為了達到所有遷移所定義的狀態,需要執行所有遷移,包括創建表的遷移,從而丟棄其中的所有內容。

我希望這有幫助,
安迪

暫無
暫無

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

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