我正在使用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中它知道这是第一次,为什么它不会直接使用架构而不是运行所有迁移?我是一个菜鸟,这似乎是合理的,但另一方面,运行迁移会获得相同的结果,所以......(但是那些不会盲目地在生产中使用迁移的人们呢?不会他们被卡住?)谢谢。
答案 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获取迁移文件并执行它们。 所以如果一个表不存在,它会告诉你这样的。如果您的部署是第一次部署到该计算机,或者配置的数据库尚未初始化,您应该这样做:
创建数据库
rake db:create
这将创建所有表
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不会这样做,因为它运行起来非常危险(您可能永远不想重新创建生产数据库)