Rails控制台无法连接到数据库,但rake任务可以。

5
我的rails应用程序使用了一键式DO镜像。我可以成功运行任何rake db:*,但当我运行rails console时,无法连接到数据库。如何解决?应用程序正常工作,所以我认为是一个rails console的问题。
控制台输出:
deployer:/home/rails$ RAILS_ENV=production bundle exec rake db:migrate
  ActiveRecord::SchemaMigration Load (3.2ms)  SELECT "schema_migrations".* FROM "schema_migrations"

deployer:/home/rails$ echo $APP_DATABASE_PASSWORD
[redacted database password]

deployer:/home/rails$ RAILS_ENV=production bundle exec rails console
Running via Spring preloader in process 25038
Loading production environment (Rails 4.2.6)
2.3.0 :001 > User.connection
PG::ConnectionBad: fe_sendauth: no password supplied

database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  host: localhost
  username: rails
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>

production:
  <<: *default
  database: production
  username: rails
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>

EDIT

我发现 ActiveRecord::Base.configurations 中的 password: nil。那么为什么服务器进程可以读取密码,但控制台却不能?

我将 ActiveRecord::Base.configurations 添加到了初始化器中。在初始化时,密码是存在的。

在控制台中,ActiveRecord::Base.configurations 返回了所有预期的信息,除了密码。我甚至已经用 . /etc/defaults/unicorn 重新加载了默认变量。

EDIT 2

RAILS_ENV=production bundle exec rails console 中,ActiveRecord::Base.configurations 返回结果。

{"default"=>
  {"adapter"=>"postgresql",
   "encoding"=>"unicode",
   "pool"=>5,
   "host"=>"localhost",
   "username"=>"rails",
   "password"=>nil},
 "development"=>
  {"adapter"=>"postgresql",
   "encoding"=>"unicode",
   "pool"=>5,
   "host"=>"localhost",
   "username"=>"rails",
   "password"=>nil,
   "database"=>"development"},
 "test"=>
  {"adapter"=>"postgresql",
   "encoding"=>"unicode",
   "pool"=>5,
   "host"=>"localhost",
   "username"=>"rails",
   "password"=>nil,
   "database"=>"test"},
 "production"=>
  {"adapter"=>"postgresql",
   "encoding"=>"unicode",
   "pool"=>5,
   "host"=>"localhost",
   "username"=>"rails",
   "password"=>nil,
   "database"=>"production"}}

ActiveRecord::Base.configurations 是在 APP_DATABASE_PASSWORD=password RAILS_ENV=production bundle exec rails console 命令下获取的。

{"default"=>
  {"adapter"=>"postgresql",
   "encoding"=>"unicode",
   "pool"=>5,
   "host"=>"localhost",
   "username"=>"rails",
   "password"=>nil},
 "development"=>
  {"adapter"=>"postgresql",
   "encoding"=>"unicode",
   "pool"=>5,
   "host"=>"localhost",
   "username"=>"rails",
   "password"=>nil,
   "database"=>"development"},
 "test"=>
  {"adapter"=>"postgresql",
   "encoding"=>"unicode",
   "pool"=>5,
   "host"=>"localhost",
   "username"=>"rails",
   "password"=>nil,
   "database"=>"test"},
 "production"=>
  {"adapter"=>"postgresql",
   "encoding"=>"unicode",
   "pool"=>5,
   "host"=>"localhost",
   "username"=>"rails",
   "password"=>nil,
   "database"=>"production"}}

当你在 RAILS_ENV=production bundle exec rails server 上运行时,ActiveRecord::Base.configurations 是相关的。
{"default"=>
  {"adapter"=>"postgresql",
   "encoding"=>"unicode",
   "pool"=>5,
   "host"=>"localhost",
   "username"=>"rails",
   "password"=>[password]},
 "development"=>
  {"adapter"=>"postgresql",
   "encoding"=>"unicode",
   "pool"=>5,
   "host"=>"localhost",
   "username"=>"rails",
   "password"=>[password],
   "database"=>"development"},
 "test"=>
  {"adapter"=>"postgresql",
   "encoding"=>"unicode",
   "pool"=>5,
   "host"=>"localhost",
   "username"=>"rails",
   "password"=>[password],
   "database"=>"test"},
 "production"=>
  {"adapter"=>"postgresql",
   "encoding"=>"unicode",
   "pool"=>5,
   "host"=>"localhost",
   "username"=>"rails",
   "password"=>[password],
   "database"=>"production"}}

你尝试过 RAILS_ENV=production bundle exec rails console -e production 吗?我曾经遇到一个问题,RAILS_ENV=production 没有在生产模式下启动控制台,我不得不使用 -e 选项。 - coding addicted
当你使用 rails s 运行服务器并发出请求时会发生什么? - Малъ Скрылевъ
@codingaddicted 运行 APP_DATABASE_PASSWORD=password RAILS_ENV=production bundle exec rails console 无法正常工作。我不明白为什么会这样。以下是 ActiveRecord::Base.configurations 的相关输出:"password"=>nil - Nicos Karalis
@МалъСкрылевъ,在服务器进程上一切正常。数据库按预期进行查询,rake任务可以读取和更新数据库。 - Nicos Karalis
服务器启动时,ActiveRecord::Base.configurations 显示什么? - Малъ Скрылевъ
显示剩余7条评论
1个回答

13

事实证明,重要的区别在于Spring预加载器。看起来您在定义ENV变量之前启动了Spring

尝试关闭Spring并重新启动控制台。


1
停止 Spring 的命令:bundle exec spring stopbin/spring stop - Matthew
这个解决方案让我从一个令人恼火的密集的Postgres错误中解脱出来,即在Rails控制台中不断收到的PG :: ConnectionBad:FATAL:用户错误的密码身份验证失败。非常感谢! - Josh Frankel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接