我在访问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
5条答案
按热度按时间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
yftpprvb2#
使用ENV变量作为密码,很可能变量本身不存在。使用
printenv
确认变量存在。例如,在将变量包含在/etc/environment
文件中后,您需要重新登录/重启才能访问变量。如果这样做有效,可能比更改pg_hba.conf
更好。afdcj2ne3#
这对我来说很有效,这是我唯一需要做的修改。(好吧,我用12.1重新安装了pgsql)
0aydgbwb4#
我在设置Rails 6应用程序时遇到了同样的问题。
问题是,当使用
rails server
启动Rails服务器,并尝试从浏览器查看应用程序时,我得到以下错误:我是这么解决的:
该问题是由于我没有指定/提供应用程序要使用的数据库密码导致的,因此当应用程序尝试连接到
config/database.yml
中指定的数据库时,它会遇到该错误。我通过在
config/database.yml
:此外,如果尚未使用以下命令创建应用程序的数据库,请确保已创建该数据库:
之后我重新启动了rails服务器:
这一次当我尝试从浏览器查看应用程序时,它工作得很好。
就这样了
"我希望这能帮上忙"
5cg8jx4n5#
我尝试使用对等身份验证,该身份验证不应要求输入密码。
对我来说,问题是我在database.yml中指定了localhost,这样就迫使数据库驱动程序尝试建立不同类型的连接(例如,tcp、命名管道等)
删除“主机:我的配置中的“localhost”行为我解决了这个问题,另一个答案是:ActiveRecord connection to a localhost postgresql database in trust mode
请注意,在我的例子中,我使用的是“peer”方法,而不是“trust”方法,但解决方案是相同的