Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么第一次使用Capistrano部署时会运行db:migrate?_Ruby On Rails_Migration_Capistrano_Capistrano3 - Fatal编程技术网

Ruby on rails 为什么第一次使用Capistrano部署时会运行db:migrate?

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

我第一次使用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/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数据库:创建

  • 这将创建所有表

    2运行迁移

     `rake db:migrate`
    
    很明显,您需要进行迁移

    强烈建议不要加载模式(除非您别无选择),因为在(回滚等)之后很难处理模式,但如果您别无选择,可以执行rake
    db: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)看起来正常。