OperationalError at /admin/
FATAL: Peer authentication failed for user "myuser"
当我尝试访问我的Django管理站点时,这是我收到的错误。我一直在使用MySQL数据库没问题。我是PostgreSQL的新手,但决定切换,因为我最终计划用于此项目的主机没有MySQL。
因此,我想我可以完成安装PostgreSQL的过程,运行syncdb
并完成设置。
问题是我似乎无法让我的应用程序连接到数据库。我可以通过我下载的命令行或桌面应用程序登录PostgreSQL。只是不在脚本中。
另外,我可以使用manage.py shell
来访问数据库。
有什么想法吗?
答案 0 :(得分:205)
我看了一眼异常,注意到它与我的连接设置有关。回到 settings.py ,看到我没有主机设置。添加localhost
和瞧。
我的settings.py没有用于MySQL数据库的HOST,但是我需要为PostgreSQL添加一个HOST才能工作。
在我的情况下,我将localhost
添加到HOST
设置中并且有效。
以下是我DATABASES
的{{1}}部分。
settings.py
答案 1 :(得分:19)
这可能是因为您的脚本在其他用户之下运行,而不是您尝试连接的用户( myuser 此处)。在这种情况下,对等身份验证将失败。使用HOST: "localhost"
的解决方案有效,因为您不再使用对等身份验证。但是,它比HOST: ""
慢,因为您使用TCP连接而不是使用unix套接字。来自django docs:
如果你正在使用PostgreSQL,默认情况下(空HOST),连接到 数据库是通过UNIX域套接字(“本地”行)完成的 的pg_hba.conf)。如果要通过TCP套接字连接,请将HOST设置为 'localhost'或'127.0.0.1'(pg_hba.conf中的'host'行)。在Windows上, 你应该总是定义HOST,因为UNIX域套接字不是 可用。
如果您想继续使用套接字,则需要pg_hba.conf
中的正确设置。最简单的是:
local all all trust
同时在配置中注释掉所有其他local
行。请注意,需要重新加载postgres才能使此更改生效。
但是如果多用户生产机器存在问题,您可能希望使用更安全的内容,例如md5
(有关各种身份验证方法的说明,请参阅here)。
答案 2 :(得分:14)
比完全信任更好的是将其设置为md5。
# "local" is for Unix domain socket connections only
local all all md5
答案 3 :(得分:6)
我通过编辑/etc/postgres/9.1/main/pg_hba.conf的底部来修复此问题(将md5更改为信任;注意这意味着没有数据库密码,这可能不是您想要的)< / p>
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
答案 4 :(得分:3)
我只是偶然发现了同样的问题,但是想像clime所说的那样使用unix套接字,但仍然使用peer
方法。我使用pg_hba.conf
内的postgres-username映射了我的system-username,该用户使用的是peer
方法。
我在pg_hba.conf
内添加了:
local all all peer map=map-name
我在pg_ident.conf
内添加了:
map-name mysystem-username mypostgres-username