OperationalError at /admin/
FATAL: Peer authentication failed for user "myuser"
这是我收到的错误,当我试图得到我的Django管理网站。我一直在使用MySQL数据库,没有问题。我是PostgreSQL的新手,但决定切换,因为我最终计划在这个项目中使用的主机没有MySQL。
因此,我想我可以通过安装PostgreSQL的过程,运行一个syncdb
,并设置好。
问题是,我似乎不能让我的应用程序连接到数据库。我可以通过命令行或我下载的桌面应用程序登录PostgreSQL。只是剧本里没有。
同样,我可以使用manage.py shell
来访问数据库。
任何想法吗?
我偷看了一下异常,注意到它与我的连接设置有关。回到settings.py,发现没有主机设置。加入localhost
,瞧!
我的settings.py没有MySQL数据库的主机,但是我需要为PostgreSQL添加一个主机。
在我的例子中,我将localhost
添加到HOST
设置中并且它工作了。
这是DATABASES
部分从我的settings.py
。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': '<MYDATABASE>',
'USER': '<MYUSER>',
'PASSWORD': '<MYPASSWORD>',
'HOST': 'localhost', # the missing piece of the puzzle
'PORT': '', # optional, I don't need this since I'm using the standard port
}
}
这可能是因为您的脚本运行在其他用户下,而不是您试图连接的用户(此处myuser)。在这种情况下,对等体身份验证将失败。您使用HOST: "localhost"
的解决方案可以工作,因为您不再使用对等身份验证。但是,它比HOST: ""
慢,因为使用的不是unix套接字,而是TCP连接。来自django docs:
如果你正在使用PostgreSQL,默认情况下(空HOST),连接到数据库是通过UNIX域套接字(' local '行)完成的pg_hba.conf)。如果您希望通过TCP套接字连接,请将HOST设置为' localhost '或' 127.0.0.1 ' (' host '行在pg_hba.conf)。在Windows上,您应该始终定义HOST,因为UNIX域套接字没有定义HOST可用。
如果您想继续使用套接字,需要在pg_hba.conf
中正确设置。最简单的是:
local all all trust
同时注释掉配置中的所有其他local
行。请注意,需要重新加载postgres才能生效。
但是,如果多用户生产机器存在问题,您可能希望使用更安全的东西,如md5
(请参阅此处了解各种身份验证方法的解释)。
将其设置为md5比完全信任更好。
# "local" is for Unix domain socket connections only
local all all md5
我通过编辑/etc/postgresg/9.1/main/pg_hba.conf的底部来修复这个问题(将md5更改为trust;注意:这意味着没有数据库密码,这可能不是你想要的)
# 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
我只是偶然发现了同样的问题,但想使用unix套接字作为clime说,但仍然使用peer
方法。我在pg_hba.conf
中映射了我的系统用户名和postgresql用户名,这与peer
方法一起工作。
Inside pg_hba.conf
i add:
local all all peer map=map-name
Inside pg_ident.conf
i add:
map-name mysystem-username mypostgres-username