Rails:fe_sendauth:Ruby 未提供密码 (PG::ConnectionBad),但在 Rails 中正常

Rails: fe_sendauth: no password supplied (PG::ConnectionBad) from Ruby, but ok in Rails

我在直接 ruby.

评估 postgres 数据库时遇到问题

我使用 Rails

创建了一个 Postgres 数据库
>rails new www --database=postgresql

使用 Rails 4.2.5 和 Postgres 是 9.4

它生成以下 config/database.yml 文件。

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

development:
  <<: *default
  database: www_development

test:
  <<: *default
  database: www_test

production:
  <<: *default
  database: www_production
  username: www
  password: <%= ENV['WWW_DATABASE_PASSWORD'] %>

我可以 运行 rails 服务器,db:drop、db:create 和 db:migrate 没问题。

我也可以使用 psql 正常访问数据库

>psql www_development

但是 当我 运行 来自非 Rails 项目目录的以下 app.rb ,我收到 fe_sendauth: no password supplied (PG::ConnectionBad) 错误消息。

这显然不是 Rails 问题。我要么在我的 ruby 中遗漏了一些东西,要么 Postgres 需要一个星期来处理 Rails 和纯 Ruby 之间的一些差异 [我不知道]。我还包含了 Postgres 的 pg_hba.conf 文件。

想办法解决这个问题已经束手无策了。任何帮助将非常感激。

app.rb

require 'yaml'
require 'active_record'
require 'pg'

ActiveRecord::Base.establish_connection(
  adapter:  'postgresql',
  host:     'localhost',
  database: 'www_development',
)

/etc/postgresql/9.4/main/pg_hba.conf

# TYPE  DATABASE        USER            ADDRESS                 METHOD

local   all             postgres                                peer
local   all             all                                     peer
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5

您没有在 ActiveRecord::Base.establish_connection( 中指定用户名和密码。我假设您想为 www_development 数据库使用一些没有密码的 SUPERUSER - 对吗?

按照 documentation peer auth 做

Obtain the client's operating system user name from the operating system and check if it matches the requested database user name.

这就是为什么如果你可以 psql 没有密码,你应该可以 运行 app.rb 使用相同的 OS 用户和环境 没有密码。如果不能,那么 app.rb 会尝试使用不同的用户名进行连接...

选项:

  1. username: postgres放到ActiveRecord::Base.establish_connection(

  2. local all all peer更改为local all all trust

使用 ENV 变量作为密码很可能变量本身不存在。使用 printenv 确认存在。例如,在将变量包含在 /etc/environment 文件中后,您需要 relogin/reboot 才能访问该变量。如果这可行,它可能比更改 pg_hba.conf.

更好

我在设置 Rails 6 应用程序时遇到了同样的问题。

问题是当使用 rails server 启动 rails 服务器并尝试从浏览器查看应用程序时,出现以下错误:

ActiveRecord::ConnectionNotEstablished
fe_sendauth: no password supplied

我是这样解决的:

问题是我造成的不是specifying/supplying应用程序要使用的数据库密码,所以当应用程序尝试连接到指定的数据库时config/database.yml 它遇到了那个错误。

我通过在 config/database.yml 中指定应用程序的数据库密码解决了这个问题:

# The password associated with the postgres role (username).
password: my-password

此外,如果您尚未使用以下方法创建应用程序的数据库,请确保您已经为该应用程序创建了数据库:

rails db:create

之后我重新启动了 rails 服务器:

rails server

这次当我尝试从浏览器查看应用程序时,它工作正常。

就这些了。

希望对您有所帮助

development:
  <<: *default
  database: postgres
  username: postgres
  password: postgres
  # must specify the right DB, superuser and superuser Password as per postgreSQL setup

这对我有用,是我需要做的唯一改变。 (好的,我用 12.1 重新安装了 pgsql)