Rails:fe3endauth:Ruby没有提供密码(PG::ConnectionBad),但在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-server、db:drop、db:create和db:migrate fine。

我还可以使用psql访问数据库

>psql www_development

但是当我从非Rails项目目录运行以下app.rb时,我会收到fe3endauth:未提供密码(PG::ConnectionBad)错误消息。

这显然不是Rails的问题。我要么在ruby中遗漏了一些东西,要么Postgres需要一个tweek来处理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,对吧?

根据文档对等授权进行

从操作系统获取客户端的操作系统用户名系统,并检查它是否与请求的数据库用户名匹配。

这就是为什么如果您可以在没有密码的情况下运行psql,那么您应该可以在没有口令的情况下使用相同的操作系统用户和环境运行app.rb。如果你不能,那么app.rb会尝试使用不同的用户名连接…

选项:

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

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

使用ENV变量作为密码,很可能变量本身不存在。用printenv确认存在。例如,在将变量包含在/etc/environment文件中之后,您需要重新登录/重新启动才能访问该变量。如果这样做有效,可能比更改pg_hba.conf要好。

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

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

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

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

ActiveRecord::ConnectionNotEstablished
fe_sendauth: no password supplied

以下是我解决问题的方法

该问题是由我没有指定/提供应用程序要使用的数据库密码引起的,因此当应用程序尝试连接到config/database.yml中指定的数据库时,会遇到该错误。

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

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

此外,如果您还没有使用创建应用程序的数据库,请确保您已经为该应用程序创建了数据库

rails db:create

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

rails server

这一次,当我尝试从浏览器中查看应用程序时,它运行良好。

仅此而已。

我希望这能帮助

我试图使用对等身份验证,而不应该要求密码。

对我来说,问题是我在database.yml中指定了localhost,这迫使数据库驱动程序尝试建立不同类型的连接(例如,tcp、命名管道等)

删除";host:"localhost";根据另一个答案,我的配置中的一行为我解决了问题:在信任模式下,ActiveRecord连接到localhostpostgresql数据库

注意,在我的情况下,我使用的是"peer"方法,而不是"trust"方法,但解决方案是相同的

相关内容

最新更新