MySQL Python 客户端得到 1045 (28000):用户 'root'@'localhost' 的访问被拒绝

MySQL Python client got 1045 (28000): Access denied for user 'root'@'localhost'

pymysqlmysql-connector-python 都会出现此错误。但不是到MySQLshell。 MySQL shell 可以通过 mysql -u root -p 正常登录。

错误看起来像:

In [1]: import mysql.connector

In [2]: mydb = mysql.connector.connect(
   ...:   host="localhost",
   ...:   user="root",
   ...:   passwd="password"
   ...: )

ProgrammingError: 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

或者

In [8]: import pymysql.cursors

In [9]: connection = pymysql.connect(host='localhost',
   ...:                              user='root',
   ...:                              password='password',
   ...:                              db='db',
   ...:                              cursorclass=pymysql.cursors.DictCursor)

...
OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")

Python 版本 3.7,运行 Mac OSX 10.14。 MySQL 版本 8.0.16.

我搜索了网站上的所有答案。没有找到修复,因此想记录这个解决方案以帮助其他人 运行 遇到类似情况。

pymysql 停止工作的罪魁祸首应该是升级到 MySQL 8。 MySQL 8 比以前的 5.7 具有更强的密码验证。从 8 降级到 5.7 是我不想经历的很多痛苦。通过编辑 my.cnf 恢复到旧版身份验证的简单尝试失败了。

然后我看了这篇博客:https://blog.csdn.net/zoe9698/article/details/78171465(中文的)

基本上是说用户不应该 root。 Python 连接被视为 "remote",因此禁止记录为 root

所以只需创建另一个用户并授予其所有权限即可。

mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost';
Query OK, 0 rows affected (0.00 sec)

将代码中的root替换为user,错误消失