django.db.utils.OperationalError: (1045, "用户 'root'@'localhost' 的访问被拒绝(使用密码:是)")

17

当我使用命令“python manage.py makemigrations”(与输入“python manage.py runserver”相同)时,它抛出了这个错误。然后我检查了用户的权限。代码和结果如下所示。

mysql> select host,user from mysql.user;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| %         | root          |
| %         | zhuxin        |
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
| localhost | zhuxin        |
+-----------+---------------+


mysql> show grants for 'zhuxin'@'%'; 
+---------------------------------------------------------------+ 
| Grants for zhuxin@%                                           |
+---------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'zhuxin'@'%' WITH GRANT OPTION | 
| GRANT ALL PRIVILEGES ON `blogdb`.* TO 'zhuxin'@'%'            |  
+---------------------------------------------------------------+ 

mysql> show grants for 'root'@'%';
+--------------------------------------------------+
| Grants for root@%                                | 
+--------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'root'@'%'                 | 
| GRANT ALL PRIVILEGES ON `blogdb`.* TO 'root'@'%' |  
+--------------------------------------------------+

我已经尝试了一切办法来解决它,但都无济于事。


原来问题出在mysql数据库中的授权上。你提到这些输入语句让我注意到了这个问题。 - polendina
10个回答

19

你需要在项目设置文件 settings.py 中进行更改。为你的数据库提供USERPASSWORD

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject',
        'USER': 'root',
        'PASSWORD': 'rootpassword',
        'HOST': 'localhost',
        'PORT': '',
    }
}

2
哦,是的,我已经像这样更改了settings.py文件: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'blogdb', 'USER': 'root', 'PASSWORD': '1234', 'HOST': '', 'PORT': '', } }. 但是错误仍然存在。 - Krimony
@朱朱鑫,你检查过使用这个用户名和密码是否可以成功验证到mysql服务器了吗? - Astik Anand
2
谢谢。我明白了!当我授权时,我将“localhost”更改为“127.0.0.1”。但我不知道为什么。也许像你说的那样,我混淆了用户。 - Krimony
@朱朱鑫,很高兴听到这个好消息。如果我的解决方案对您有帮助,请选择答案。感谢您的合作。 - Astik Anand
如果您在部署到AWS弹性Beanstalk时遇到此错误,您只需从控制台进入配置,并确保更新RDS DB密码即可。 - Lawrence DeSouza
我在使用一个文件来读取凭据,但路径中出现了一个拼写错误。所以当你遇到这个错误时,还是需要仔细检查一下 :-) - Anique

2

我曾经遇到过同样的错误,将HOST更改为127.0.0.1并移除密码后问题得到了解决。你也可以尝试一下,看看是否对你有用。


这对我很重要。MySQL不允许远程连接。使用IP似乎被视为远程连接。使用“localhost”解决了这个问题。 - Abpostman1

2

检查您的数据库用户名和密码。很多时候,我们会输错。这会导致与数据库用户名和密码不匹配而出现错误。我曾经遇到过这种错误,相信我,这是我的非常糟糕的经历。


这并不是对问题的回答。一旦您拥有足够的声望,您就可以在任何帖子上进行评论; 相反,提供不需要询问者澄清的答案。 - Til
这实际上可能是一个解决方案。我为一个docker化的微服务构建了一个环境变量,从另一个类似的微服务中复制了它。我创建了一个用户,其密码与此环境变量文件中的密码不同,并在运行makemigrations时遇到了问题。 - nnov

0

我尝试了只是删除整个密码,它就可以工作了。所以我的结论是我输入的密码是错误的,因此显示了那个错误,而且由于我没有设置密码,所以当我删除密码时它就可以工作了。


嗨,Rahul。感谢您的贡献。但是这只是一个评论,而不是答案。应该随着从数据库中删除密码的过程一起提供settings.py。但一般来说,如果您只要做一个一行代码的贡献,请将其作为评论而不是答案。【如何回答】(https://stackoverflow.com/help/how-to-answer)。亲切的问候。 - Elletlar

0

我在将我的项目从备份文件复制到新机器上后看到了这个错误信息。另外还有一条错误信息解释了问题:

[Warning] World-writable config file '/home/myuser/myproject/database.cnf' is ignored.

我的数据库配置文件的权限已经被更改,因此它没有被加载,因此Django尝试使用错误的用户进行连接。我通过运行以下命令来解决这个问题:

chmod 600 database.cnf

0

如果没有设置密码,请删除密码字段。

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "reservations",
        "HOST": "127.0.0.1",
        "PORT": "3306",
        "USER": "root",
    }
}


添加这段代码。

0
我不小心使用了用户名:
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'inventory',
    'HOST': '127.0.0.1',
    'USERNAME': 'root',
    'PORT': '',
    'PASSWORD': '',  # Your Password
}

只需将其更改为用户即可。

0

MySQL数据库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'your database name',
        'HOST': 'localhost',
        'PASSWORD': 'your database password',
        'USER': 'root'
    }
}

0
在我的情况下,我使用了错误的端口号。我在3307上配置了MySql,但在settings.py文件中使用了3306。
DATABASES = {
"default": {
    "ENGINE": "django.db.backends.mysql",
    "NAME": "reservations",
    "HOST": "127.0.0.1",
    "PORT": "3307",
    "USER": "root",
}

}


-1
我遇到了同样的问题,从linuxnightly.com上学到,这是由于auth socket插件引起的,一旦你禁用它,问题就解决了。
在以root身份登录mysql后,尝试运行以下命令:
mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password_here';
mysql> exit;
$ sudo systemctl restart mysql

要使此工作生效,您必须更改根用户的密码。这可以通过 UPDATE 命令来完成。在过程结束时,您必须使用 systemctl 命令重新启动 MySQL。

来源:https://linuxnightly.com/error-1698-28000-access-denied-for-user-rootlocalhost/


你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community
尽管此链接可能回答了问题,但最好在此处包含答案的关键部分,并提供链接以供参考。仅有链接的答案如果链接页面发生变化可能会失效。- 来自审查 - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接