Как решить проблему (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:

  1. проверяет, что пользователь существует и что вход в систему разрешен для этого пользователя с любого IP-адреса,
  2. проверяет, что пользователь имеет все привилегии на базе данных
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
Вернуться на верх