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
会尝试使用不同的用户名进行连接...
选项:
将username: postgres
放到ActiveRecord::Base.establish_connection(
将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)
我在直接 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
会尝试使用不同的用户名进行连接...
选项:
将
username: postgres
放到ActiveRecord::Base.establish_connection(
将
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)