我在使用直接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
会尝试使用不同的用户名连接…
选项:
-
将
username: postgres
放入ActiveRecord::Base.establish_connection(
-
将
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"方法,但解决方案是相同的