为什么首先使用Capistrano部署运行db:migrate?

时间:2014-02-09 02:49:49

标签: ruby-on-rails migration capistrano capistrano3

我正在使用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 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  1. 创建数据库

    rake db:create

  2. 这将创建所有表

    2运行迁移

     `rake db:migrate`
    

    显然,您需要进行迁移。

    强烈建议不要加载架构(除非你别无选择),因为在(回滚等)之后很难处理架构,但如果你别无选择,可以执行ra db:schema:load

    请参阅此内容以获取更多信息

    rake db:schema:load vs. migrations

    How to update production database schema safely in rails 3.1.3?

答案 3 :(得分:0)

从错误中看,您试图将client_infos表重命名为clients,但client_infos表不存在,但是您没有先前的迁移创建了client_infos表?

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

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

  

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

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