Ruby on rails 为什么第一次使用Capistrano部署时会运行db:migrate?
我第一次使用Capistrano部署到生产环境中,运行时遇到了一个错误Ruby on rails 为什么第一次使用Capistrano部署时会运行db:migrate?,ruby-on-rails,migration,capistrano,capistrano3,Ruby On Rails,Migration,Capistrano,Capistrano3,我第一次使用Capistrano部署到生产环境中,运行时遇到了一个错误 cap生产部署 错误是: ** Invoke deploy:migrate (first_time) ** Invoke deploy:set_rails_env ** Execute deploy:migrate DEBUG [048f89c6] Running /usr/bin/env if test ! -d /home/deployer_user/apps/ap_production/releases/2014020
cap生产部署
错误是:
** Invoke deploy:migrate (first_time)
** Invoke deploy:set_rails_env
** Execute deploy:migrate
DEBUG [048f89c6] Running /usr/bin/env if test ! -d /home/deployer_user/apps/ap_production/releases/20140209005208; then echo "Directory does not exist '/home/deployer_user/apps/ap_production/releases/20140209005208'" 1>&2; false; fi on eslope.net
DEBUG [048f89c6] Command: if test ! -d /home/deployer_user/apps/ap_production/releases/20140209005208; then echo "Directory does not exist '/home/deployer_user/apps/ap_production/releases/20140209005208'" 1>&2; false; fi
DEBUG [048f89c6] Finished in 0.160 seconds with exit status 0 (successful).
INFO [52f75214] Running ~/.rbenv/bin/rbenv exec bundle exec rake db:migrate on eserver.net
DEBUG [52f75214] Command: cd /home/deployer_user/apps/ap_production/releases/20140209005208 && ( RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.0 RAILS_ENV=production ~/.rbenv/bin/rbenv exec bundle exec rake db:migrate )
DEBUG [52f75214] rake aborted!
DEBUG [52f75214] An error has occurred, this and all later migrations canceled:
DEBUG [52f75214]
DEBUG [52f75214] PG::UndefinedTable: ERROR: relation "client_infos" does not exist
DEBUG [52f75214] : ALTER TABLE "client_infos" RENAME TO "clients
这个错误实际上是完全有道理的。引用的表不存在。我不明白的是为什么迁移会运行?为什么数据库不是在第一次运行时从模式创建的呢。我是否无意中删除了一个说明运行了哪些迁移的文件?要么删除它,要么“.git”忽略它
我想我知道如何修复它(rake db:create或类似),但我不明白的是,如果在Capistrano v3中它知道这是第一次,为什么它不直接使用模式而不是运行所有迁移?我是一个noob,这似乎是合理的,但另一方面,运行迁移将实现相同的结果,所以。。。(但对于那些不知道如何在生产中盲目使用迁移的人,他们不会被卡住吗?)谢谢。检查您的数据库。yml config,production part,如果正确的话。然后确保Postgresql server正在生产服务器上运行,并且应用程序(作为用户)具有访问权限。我假设“deployer”是用户,所以请检查此用户是否具有所有必要的权限。db:migrate获取迁移文件并执行它们。 所以如果一个表不存在,它会告诉你是这样的。如果您的部署是第一次部署到该计算机,或者配置的数据库尚未初始化,则应执行以下操作:
rake数据库:创建
`rake db:migrate`
很明显,您需要进行迁移
强烈建议不要加载模式(除非您别无选择),因为在(回滚等)之后很难处理模式,但如果您别无选择,可以执行rakedb:schema:load
有关更多信息,请参见此
从错误中可以看出,您试图将
客户机信息
表重命名为客户机
,但是客户机信息
表不存在,但是您是否没有创建客户机信息
表的早期迁移
如果您没有创建client\u infos
表的迁移,那么它来自哪里?您是手动创建的吗?对数据库的所有更改都应伴随迁移
如果您确实为client\u infos
表进行了迁移,那么schema\u migrations
数据库表(Rails保存迁移运行记录的地方)可能会以某种方式不同步。鉴于您是第一次部署,可能值得删除整个数据库并重新开始
我不明白的是为什么迁移会运行?为什么数据库不是在第一次运行时从模式创建的
如果写得正确,迁移应该具有与加载模式相同的效果,它们将以增量方式进行。当然,如果您愿意,您可以手动加载模式,但Capistrano不会这样做,因为运行它是一件非常危险的事情(您可能永远都不想重新创建生产数据库)最终,我所做的是按照lmars和Nick的建议。我直接在生产机器上运行了类似的操作:
RAILS_ENV=production bundle exec rake db:drop
RAILS_ENV=production bundle exec rake db:schema:create
RAILS_ENV=production bundle exec rake db:schema:load
这当然会破坏数据库中的数据,但在第一次部署时,这不是问题
我想有更简单的方法,但是。。。我不知道。看起来不像是capistrano部署的一套现成配方,所以很难判断是什么原因导致了这种情况。例如,为什么第一次运行时没有这样做:RAILS\u ENV=production rake db:create db:schema:loadyou尝试过
cap deploy:cold
?gmaliar-很好的建议,但是capdeploy:cold在CapistranoV3中是不推荐使用的,我应该提到我使用的是.Imars,谢谢你看这个。你是对的,错误是关于表的(我想在我的问题中我注意到它所抱怨的表不存在)。我的问题是,在这种情况下,为什么要运行迁移。我把你的答案翻了一遍,我不认为它回答了这个问题(尽管它确实给了我更多关于如何解决它的想法)。谢谢,谢谢,尼克。绝对有用的信息,我想我可能会按照你的建议去做,但在这个例子中,我的问题是为什么Capistrano(v3.x)会这么做。我希望能够弄明白,如果我再次以这种方式部署,它将起作用。(我向您提供了一个答案。)我相信我无法成功运行rake db:create来部署,因为在部署之前,除了手动创建的database.yml之外,我在远程服务器上没有任何项目文件,所以rake在没有rakefile的情况下无法运行。在第一次部署之前,我需要做所有的事情来运行rake吗?Nikos,谢谢你的建议。我可以使用psql-h(ip地址)-U(正确的用户名)和-d(数据库名称)从另一台机器进行连接。数据库用户与部署人员不是同一个用户,但我将db设置为m5,并且database.yml部分(唯一的部分是prod)看起来正常。