Python MySQLdb - 错误1045:用户访问被拒绝

8 投票
1 回答
15364 浏览
提问于 2025-04-17 21:24

我有一段Python代码,内容是这样的:

import MySQLdb
import sys

try:
    con = MySQLdb.connect(host = 'localhost',user = 'crawler',passwd = 'crawler', db = 'real_estate_analytics')

    #... rest of code ...

except MySQLdb.Error, e:

    print "Error %d: %s" % (e.args[0],e.args[1])
    sys.exit(1)

问题是我遇到了以下错误:

错误 1045: 用户 'crawler'@'localhost' 被拒绝访问 (使用密码: 是)

但是如果我在终端输入 mysql -u crawler -pcrawler,就能顺利访问数据库,没问题。

mysql> show databases;
+-----------------------+
| Database              |
+-----------------------+
| information_schema    |
| AL                    |
| cloversoup            |
| codebar               |
| mysql                 |
| performance_schema    |
| real_estate_analytics |
| teste                 |
+-----------------------+
8 rows in set (0.00 sec)

我还删除了匿名用户,以避免冲突。我的用户有:

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| root    | %         |
| crawler | localhost |
| root    | localhost |
+---------+-----------+
3 rows in set (0.00 sec)

我已经给了crawler所有的权限(并刷新了权限),所以这应该不是问题:

GRANT ALL PRIVILEGES ON *.* TO crawler@localhost IDENTIFIED BY 'crawler' WITH GRANT OPTION;

FLUSH PRIVILEGES;

实际上:

mysql> show grants;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for crawler@localhost                                                                                                              |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'crawler'@'localhost' IDENTIFIED BY PASSWORD '*A594DECC46D378FDA13D7843740CBF4985E6969B' WITH GRANT OPTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

我还尝试用 root 用户连接,代码是:

con = MySQLdb.connect(host = 'localhost',user = 'root',passwd = 'my_root_password', db = 'real_estate_analytics')

但也不行(同样的错误)。

这让我很抓狂。有没有人知道问题出在哪里?

附注:我知道在StackOverflow上有类似的问题,但我都看过了,没解决我的问题。所以我在这里发帖。

1 个回答

9

'localhost' 在 MySQL 中一直是个特别的东西。你在这里给 crawler@localhost 赋予了一些权限,这意味着 '用户 crawler 通过 UNIX 套接字连接'。我很确定你的 MySQL 服务器是用 --skip-networking 这个选项配置的。

这个问题可以通过明确指定来解决。使用你数据库驱动中的 unix_socket 连接参数,可以强制使用 UNIX 套接字连接。(我在这里不怕自夸,因为我是这个驱动的维护者)。

撰写回答