OperationalError at /admin/
FATAL: Peer authentication failed for user "myuser"
Это ошибка, которую я получаю, когда пытаюсь попасть на мой сайт администратора Django. Я не использовал MySQL. Я новичок в PostgreSQL, но решил переключиться, потому что хост, который я в конечном счете планирую использовать для этого проекта, не имеет MySQL.
Поэтому я решил, что смогу пройти процесс установки PostgreSQL, запустите syncdb
и все будет установлено.
Проблема в том, что я не могу заставить мое приложение подключаться к базе данных. Я могу войти в PostgreSQL через командную строку или настольное приложение, которое я загрузил. Только не в script.
Кроме того, я могу использовать manage.py shell
для быстрого доступа к db.
Любые мысли?
Я заглянул за исключение, заметил, что это связано с настройками подключения. Вернулся к settings.py и увидел, что у меня нет настройки хоста. Добавьте localhost
и вуаля.
У моих настроек .py не было базы данных HOST для 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
}
}
Возможно, это связано с тем, что ваш script работает под другим пользователем, чем тот, с которым вы пытаетесь подключиться (myuser здесь). В этом случае аутентификация одноранговой сети не удастся. Ваше решение с помощью HOST: "localhost"
работает, потому что вы больше не используете peer auth. Однако он медленнее, чем HOST: ""
, потому что вместо использования сокетов unix вы используете TCP-соединения. Из django docs:
Если вы используете PostgreSQL по умолчанию (пустой HOST), соединение с база данных выполняется через сокеты домена UNIX ("локальные строки в pg_hba.conf). Если вы хотите подключиться через сокеты TCP, установите HOST для 'Localhost или' 127.0.0.1 ('хост-строки в pg_hba.conf). В Windows, вы всегда должны определять HOST, поскольку UNIX-сокеты не являются доступны.
Если вы хотите продолжать использовать сокеты, необходимы правильные настройки в pg_hba.conf
. Самый простой способ:
local all all trust
комментируя все остальные строки local
в конфиге. Обратите внимание, что для вступления изменений в силу требуется перезагрузка postgres.
Но если многопользовательская машина обрабатывается, вы можете использовать что-то более безопасное, например md5
(см. здесь для объяснения различных методов проверки подлинности),
Лучше, чем полностью доверять, просто установите его в md5.
# "local" is for Unix domain socket connections only
local all all md5
Я исправил это, отредактировав нижнюю часть /etc/postgres/ 9.1/main/pg_hba.conf(изменив md5 на доверие; NOTE это означает, что не будет пароля базы данных, который может быть не таким, каким вы хотите)
# 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
. Я сопоставил имя моей системы с именем postgres-username внутри pg_hba.conf
, которое работает с методом peer
.
Внутри pg_hba.conf
я добавил:
local all all peer map=map-name
Внутри pg_ident.conf
я добавил:
map-name mysystem-username mypostgres-username