ruby-on-rails - Capistrano 部署 :migrate and db:migrate run all migrations every time

标签 ruby-on-rails ruby ruby-on-rails-3 rake capistrano

因此,我正在使用 rails(ruby 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 用户界面向数据库中的表格添加了几行。现在,我大胆地创建一个迁移,向表中添加一列。我将更改推送到 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 的问题(我已经更新了这个问题的标题以反射(reflect)这一点)。那么,为什么以前的迁移仍然被标记为待处理?我知道它们在过去运行过,因为我在输出中看到了它们并在运行后验证了数据库模式。

更新 #2: 设置另一个迁移并通过 ssh 连接到服务器,然后通过 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 和任何试图承担回答我措辞拙劣问题的无望任务的人!

H/T 这个问题让我眼前一亮:

Capistrano Deploy Wipes Database?

关于ruby-on-rails - Capistrano 部署 :migrate and db:migrate run all migrations every time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17374840/

相关文章:

mysql - Rails 按多个表中的属性排序帖子

ruby-on-rails - rails : Expected. 。定义 Account_number

ruby-on-rails - 为什么正则表达式不能匹配@符号?

ruby-on-rails - Rails_admin 新模型配置

ruby-on-rails - Friendly_id gem 及其对测试的影响(无 slug)

ruby-on-rails - Capistrano 部署后在目标服务器上找不到 gem

ruby-on-rails - 如何从 Visual Studio Code 运行和调试 Ruby on Rails?

ruby-on-rails - 载波还是回形针作为上传者?

javascript - CoffeeScript 不适用于 Rails 4 应用程序中的下拉菜单

ruby-on-rails - Ruby on Rails 中链接对象的 Lambda 条件