The*_*ter 115 django postgresql
OperationalError at /admin/
FATAL: Peer authentication failed for user "myuser"
Run Code Online (Sandbox Code Playgroud)
当我尝试访问我的Django管理站点时,这是我收到的错误.我一直在使用MySQL数据库没问题.我是PostgreSQL的新手,但决定切换,因为我最终计划用于此项目的主机没有MySQL.
因此,我想我可以通过安装PostgreSQL的过程,运行一个syncdb并且全部设置.
问题是我似乎无法让我的应用程序连接到数据库.我可以通过我下载的命令行或桌面应用程序登录PostgreSQL.只是不在脚本中.
此外,我可以使用manage.py shell访问数据库就好了.
有什么想法吗?
The*_*ter 211
我看了一眼异常,注意到它与我的连接设置有关.回到settings.py,看到我没有主机设置.添加localhost并瞧.
我的settings.py没有用于MySQL数据库的HOST,但我需要为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
}
}
Run Code Online (Sandbox Code Playgroud)
cli*_*ime 20
这可能是因为您的脚本在您尝试连接的用户之外的其他用户下运行(myuser here).在这种情况下,对等身份验证将失败.您的解决方案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
Run Code Online (Sandbox Code Playgroud)
同时注释掉local配置中的所有其他行.请注意,需要重新加载postgres才能使此更改生效.
但是,如果多用户生产机器存在问题,您可能希望使用更安全的东西md5(请参阅此处了解各种身份验证方法的说明).
Hou*_*man 14
比完全信任更好的只是将其设置为md5.
# "local" is for Unix domain socket connections only
local all all md5
Run Code Online (Sandbox Code Playgroud)
我通过编辑/etc/postgres/9.1/main/pg_hba.conf的底部来修复此问题(将md5更改为信任;注意这意味着没有数据库密码,这可能不是您想要的)
# 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
Run Code Online (Sandbox Code Playgroud)
小智 5
我只是偶然发现了同样的问题,但想像clime所说的那样使用unix套接字,但仍然使用该peer方法。我将我的系统用户名映射到 中的 postgres-username pg_hba.conf,它正在使用该peer方法。
在里面pg_hba.conf我补充说:
local all all peer map=map-name
Run Code Online (Sandbox Code Playgroud)
在里面pg_ident.conf我补充说:
map-name mysystem-username mypostgres-username
Run Code Online (Sandbox Code Playgroud)