1

我有一个在开发和测试中运行良好的 Rails 应用程序,但在生产中,它被配置为使用远程 Postgresql 数据库,它无法创建它的表。数据库已设置并正在运行。我可以通过 psql 作为应用程序从生产服务器连接到它,使用我在 database.yml 中指定的相同配置,然后我可以使用命令创建和查询表,没问题。

当我执行与数据库相关的 rake 任务时,一切看起来都很好:

$ rake db:reset
-- create_table("users", {:force=>true})
   -> 0.0293s
-- add_index("users", ["username"], {:name=>"index_users_on_username", :unique=>true})
   -> 0.0428s
-- initialize_schema_migrations_table()
   -> 0.0212s
-- create_table("users", {:force=>true})
   -> 0.0097s
-- add_index("users", ["username"], {:name=>"index_users_on_username", :unique=>true})
   -> 0.0058s
-- initialize_schema_migrations_table()
   -> 0.0092s

没有错误。但该表尚未创建。

我通过调查 Nginx 错误日志发现了这一点,但重现错误的最简单方法是启动控制台并使用应用程序的唯一模型执行任何操作:

$ rails console production
Loading production environment (Rails 4.2.0.beta4)
2.1.3 :001 > all_users = User.all
PG::UndefinedTable: ERROR:  relation "users" does not exist
LINE 1: SELECT "users".* FROM "users"
                          ^

我还通过 ssh 进入数据库服务器并使用 检查数据库\z,但它不存在。

我认为该应用程序正在正确连接到数据库服务器,因为之前我遇到了权限错误,并且我解决了这些问题。但我不知道如何确定。如果我确实确认我连接正确,我从那里去哪里?

谢谢!

4

1 回答 1

2

按照 mu 的建议,我跑了rake db:reset,明确指定了环境。

rake db:reset RAILS_ENV=production --trace

这揭示了问题核心的错误:

PG::ObjectInUse: ERROR:  database "database_name" is being accessed by other users
DETAIL:  There are 1 other session(s) using the database.

我 ssh'd 到数据库服务器,杀死所有活动连接,并重新启动服务。

回到网络服务器上,我重新运行了上面的 rake 任务,它工作了。感谢mu和haric!

于 2014-10-31T18:26:42.783 回答