4

我第一次使用 Capistrano 部署到生产环境,运行时出现错误

cap production deploy

错误是:

** 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

这个错误实际上是完全有道理的。引用的表不存在。我不明白为什么迁移正在运行?为什么不是在第一次运行时从模式中创建数据库。我是否无意中删除了说明已运行哪些迁移的文件?要么只是删除它,要么通过“.gitignoring”它?

我想我知道如何修复它(rake db:create 或类似的),但我不明白的是,如果在 Capistrano v3 中它知道这是第一次,为什么它不会直接使用模式而不是运行所有迁移?我是一个菜鸟,这似乎是合理的,但另一方面,运行迁移会达到相同的结果,所以......(但是那些在生产中不盲目使用迁移的人呢;不会他们被卡住了吗?)谢谢。

4

4 回答 4

1

最终我所做的是按照 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

这当然会破坏数据库中的数据,但在首次部署时,这不是问题。

我认为有一个更简单的方法,但是......我不知道。

于 2014-02-09T23:52:38.650 回答
0

检查您的 database.yml 配置、生产部分是否正确。然后确保 Postgresql 服务器正在生产服务器上运行,并且应用程序(作为用户)具有访问权限。我假设“部署者”是用户,因此请检查此用户是否拥有所有必要的权限。

于 2014-02-09T14:29:36.703 回答
0

db:migrate 获取迁移文件并执行它们。所以如果一个表不存在,它会告诉你。如果您的部署是第一次部署到该机器,或者配置的数据库尚未初始化,您应该这样做:

  1. 创建数据库

    rake db:create

这将创建所有表

2 运行迁移

 `rake db:migrate`

显然,您需要进行迁移。

强烈建议不要加载模式(除非你别无选择),因为它在(回滚等)之后很难处理模式,但如果你别无选择,你可以做 rakedb:schema:load

看到这个了解更多信息

rake db:schema:load 与迁移

如何在 Rails 3.1.3 中安全地更新生产数据库模式?

于 2014-02-09T14:41:35.047 回答
0

从错误看来,您正在尝试将表重命名client_infosclients但该client_infos表不存在,但您是否没有创建该client_infos表的早期迁移?

如果您没有创建client_infos表的迁移,那么它来自哪里?你是手动创建的吗?对数据库的所有更改都应伴随迁移。

如果您确实对client_infos表进行了迁移,那么schema_migrations数据库表(Rails 记录已运行的迁移的地方)可能会以某种方式不同步。鉴于您是第一次部署,可能值得删除整个数据库并重新开始。

我不明白为什么迁移正在运行?为什么不是在第一次运行时从架构中创建数据库

如果编写正确,迁移应该与加载模式具有相同的效果,它们只会增量执行。如果您愿意,您当然可以手动加载模式,但 Capistrano 不会这样做,因为它运行起来非常危险(您可能永远不想重新创建生产数据库)

于 2014-02-09T14:45:47.623 回答