Django与PostgreSQL的连接:"对等身份验证失败"

时间:2011-11-17 13:08:50

标签: django postgresql

OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

当我尝试访问我的Django管理站点时,这是我收到的错误。我一直在使用MySQL数据库没问题。我是PostgreSQL的新手,但决定切换,因为我最终计划用于此项目的主机没有MySQL。

因此,我想我可以完成安装PostgreSQL的过程,运行syncdb并完成设置。

问题是我似乎无法让我的应用程序连接到数据库。我可以通过我下载的命令行或桌面应用程序登录PostgreSQL。只是不在脚本中。

另外,我可以使用manage.py shell来访问数据库。

有什么想法吗?

5 个答案:

答案 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