轨道:fe_sendauth:Ruby未提供密码(PG::ConnectionBad),但在Rails中可以

3vpjnl9f  于 2022-11-29  发布在  Ruby
关注(0)|答案(5)|浏览(147)

我在访问straight 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:未提供密码(PG::ConnectionBad)***错误消息。

这显然不是Rails的问题。要么是我在Ruby中遗漏了一些东西,要么是Postgres需要一个星期来处理Rails和纯Ruby之间的一些差异(我不知道这些差异)。我还包括了Postgres的pg_hba.conf文件。
在绞尽脑汁想弄清楚这一点。任何帮助都将不胜感激。

应用程序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.配置文件

# 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
cetgtptt

cetgtptt1#

你没有在你的ActiveRecord::Base.establish_connection(中指定用户名和密码。我假设你想为www_development数据库使用一些没有密码的SUPERUSER-对吗?
按照documentation对等身份验证
从操作系统获取客户端的操作系统用户名,并检查它是否与请求的数据库用户名匹配。
这就是为什么如果你可以psql没有密码,你应该可以运行app.rb与相同的操作系统用户和环境没有密码。如果你不能,然后app.rb尝试连接不同的用户名左右...
选项:
1.将username: postgres放入ActiveRecord::Base.establish_connection(
1.将local all all peer更改为local all all trust

yftpprvb

yftpprvb2#

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

afdcj2ne

afdcj2ne3#

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

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

0aydgbwb

0aydgbwb4#

我在设置Rails 6应用程序时遇到了同样的问题。
问题是,当使用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

这一次当我尝试从浏览器查看应用程序时,它工作得很好。
就这样了
"我希望这能帮上忙"

5cg8jx4n

5cg8jx4n5#

我尝试使用对等身份验证,该身份验证不应要求输入密码。
对我来说,问题是我在database.yml中指定了localhost,这样就迫使数据库驱动程序尝试建立不同类型的连接(例如,tcp、命名管道等)
删除“主机:我的配置中的“localhost”行为我解决了这个问题,另一个答案是:ActiveRecord connection to a localhost postgresql database in trust mode
请注意,在我的例子中,我使用的是“peer”方法,而不是“trust”方法,但解决方案是相同的

相关问题