Как решить проблему (1045, "Access denied for user 'User'@'IP or host' (using password: YES)") при сборке django docker container?
У меня есть несколько баз данных в проекте django. Одна из них default
, а вторая test_dev
. Я создал docker контейнер. и все прошло хорошо до сборки контейнера. После этого, когда я пытаюсь вызвать мое django app api, которое использует test_dev
db для чтения данных. Я столкнулся с:
OperationalError at /api/projects/
(1045, "Access denied for user 'test_dev'@'xxx.xxx.xxx.xxx' (using password: YES)")
В файле настроек, моя конфигурация баз данных:
{
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': Path(__file__).resolve().parent.parent / 'db.sqlite3',
},
"test_dev" : {
'ENGINE': 'django.db.backends.mysql',
'NAME': "test",
'USER': 'test_dev',
'PASSWORD': 'db_password',
'HOST': '?=hosted_domain',
'PORT': '3306',
'SSL': True
}
}
Если вы знаете какое-либо решение. Пожалуйста, помогите мне с этим. Скоро я должен поставить вещи на производство...
Это проблема с привилегиями доступа к базе данных. Либо пароль неверный, либо пользователю не были предоставлены права доступа к конкретной базе данных или таблице, которые вам нужны, либо IP-адрес контейнера Django не совпадает с IP-адресом, привязанным к пользователю.
Следующий SQL:
- проверяет, что пользователь существует и что вход в систему разрешен для этого пользователя с любого IP-адреса,
- проверяет, что пользователь имеет все привилегии на базе данных
CREATE USER IF NOT EXISTS
'test_dev'@'%' IDENTIFIED BY 'db_password';
GRANT ALL PRIVILEGES
ON test.*
TO 'test_dev'@'%';
Я полагаю, что при создании базы данных для контейнера ваш пользователь не получил нужных прав, для предоставления прав используйте следующий фрагмент.
В вашем терминале:
mysql -h 127.0.0.1 -P 3306 -u root -p
пароль: пароль (по умолчанию)
После этого show databases;
и use test_dev;
Теперь вы можете проверить гранты с помощью команды show grants;
, так как пользователь для всех хостов не имеет никаких прав (или, возможно, пользователя вообще нет), поэтому используйте следующую команду для предоставления привилегий:
CREATE USER IF NOT EXISTS 'test_dev'@'%' IDENTIFIED BY 'db_password';
GRANT ALL PRIVILEGES ON test.* TO 'test_dev'@'%';
Я решил свою проблему, заменив двигатель. Я заменил следующую строку:
'ENGINE': 'django.db.backends.mysql',
с :
'ENGINE': 'mysql.connector.django',
Этот код решил мою текущую ошибку, но после этого я столкнулся с другой ошибкой, которую я решил, отредактировав requirements.txt
файл:
mysql-connector-python==8.0.27
к :
mysql-connector-python==8.0.26