首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Capistrano部署:迁移和db:每次迁移运行所有迁移

Capistrano部署:迁移和db:每次迁移运行所有迁移
EN

Stack Overflow用户
提问于 2013-06-28 22:55:21
回答 3查看 19.3K关注 0票数 10

因此,我正在使用rails (ruby1.9.3p392,rails 3.2,sqlite3 db),并试图将无所不在的博客教程代码部署到“生产”服务器(apache、客运、ubuntu)。我的deploy.rb看起来是这样的:

代码语言:javascript
复制
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"

现在,我敢肯定,对那些知道他们在用卡皮斯特拉诺做什么的人来说,这一定是一个很大的混乱,但我是一个彻头彻尾的规则。最后,尽管我有不足之处,部署似乎仍然有效,因为当我运行以下命令时

代码语言:javascript
复制
cap deploy:setup
cap deploy

我的应用程序已经启动并运行,因为我可以通过rails为我创建的web将几行添加到数据库中的一个表中。现在,我大胆地创建了一个迁移,将一个列添加到一个表中。我把我的改变推到git。令我恐惧的是,当我奔跑时

代码语言:javascript
复制
cap deploy

所有迁移都将运行,这将重新创建表,从而破坏我的所有数据。我多次重复这个痛苦的过程。我的schema_migrations表如下所示:

代码语言:javascript
复制
20130620210004
20130620220229
20130628213331
20130628214946
20130628223002

我在这里错过了什么?

更新:i最近给出了@TheMahrvin关于在命令行运行部署:迁移并将其从deploy.rb中删除的建议。不管用..。再次,所有的迁移都运行了。我的缪斯一定在我耳边说了些什么,因为我决定尝试运行db:在服务器本身上迁移。在运行“rake”之后,我惊讶地看到了这个输出:

代码语言:javascript
复制
  20130717230110 CreateHighScores
  20130717230342 CreateGames
  20130717231041 AddGameTypeToGame
  20130717233707 AddGamePublisherToGame
  20130717234124 AddGameRatingToGame
  20130731210558 AddGameMechanicToGame

只有最后一次迁移应该挂起。所以,也许这根本不是卡皮斯特拉诺的问题(我已经更新了这个问题的标题以反映这一点)。那么,为什么以前的移民仍然被标记为待定?我知道它们是在过去运行的,这是因为我在输出中看到了它们,并在它们运行后验证了db模式。

更新2:设置了另一个迁移和ssh到服务器和cd到“当前”目录,如果我完全理解卡皮斯特拉诺(极有可能)是当前文件的位置。正在运行

代码语言:javascript
复制
bundle exec rake db:migrate:status

抓到我了:

代码语言:javascript
复制
 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

我情不自禁地感觉到,我想做的事情有很大的错误。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-31 23:24:58

好吧,想清楚了.不过,在我最初的问题中,基于红鲱鱼,堆叠圈里的其他人应该怎么做,这是我无法理解的。

问题是我的生产数据库被设置为

代码语言:javascript
复制
db/production.sqlite3

因为它是主项目目录中的sqlite数据库,所以每次我运行时它都会被删除。

代码语言:javascript
复制
cap deploy

然后,当我要跑

代码语言:javascript
复制
cap deploy:migrate

它会找到一个空数据库,并认为所有迁移都需要运行。通过将数据库路径更改为

代码语言:javascript
复制
/my_absolute_path/shared/db/production.sqlite3

感谢@TheMahvin和其他人,他们试图承担起回答我措辞拙劣的问题这一无望的任务!

H/T对这个问题,它使天平从我的眼睛下降:

Capistrano Deploy Wipes Database?

票数 9
EN

Stack Overflow用户

发布于 2013-07-15 06:53:59

我还没看到:

代码语言:javascript
复制
after "deploy:update_code", "deploy:migrate"

在此之前。尝试删除该行并运行:

代码语言:javascript
复制
 bundle exec cap deploy:migrations (deploys code and migrations)

代码语言:javascript
复制
 bundle exec cap deploy:migrate (runs the migrate rake task on the server)

而不是。在我看来,您的deploy.rb的其余部分似乎没问题,尽管我对rvm/capistrano集成或窗口调整一无所知。

票数 7
EN

Stack Overflow用户

发布于 2013-07-12 08:10:12

您是如何“向数据库中的表中添加几行”的?

我怀疑您的数据丢失是混合迁移和您自己的db更改造成的。Rails希望您通过迁移完成所有数据库更改。

Rails社区中普遍存在一些关于迁移的争论,但是现在(特别是如果您是初学者)总是使用迁移来更改数据库。这样,您就有了完整的db蓝图,允许您从零开始在多台计算机上部署,而无需修改数据库,并确保其他贡献者有相同的数据库可供使用。

我对这类内部设备不太了解,但据我所知,您的数据丢失导致了这样的结果:

在手动更改之后,Rails无法将db布局与任何迁移的结果(分别通过迁移中的时间戳和模式)相匹配,因此将db视为新的。要进入由所有迁移定义的状态,需要执行所有迁移,包括创建表的迁移,从而丢弃表中的所有内容。

我希望这能帮到你,

安迪

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17374840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档