使用Python连接MySQL数据库遇2003连接拒绝错误求助
问题重现
使用SQLAlchemy+pymysql连接MySQL时,无论替换localhost为127.0.0.1,都报错:
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 111] Connection refused)")
连接类代码如下:
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker class DbConnectionHandler: def __init__(self) -> None: self.__connection_string = 'mysql+pymysql://root:root@localhost:3306/clean_database' self.__engine = self.__create_data_base_engine() self.session = None def __create_data_base_engine(self): engine = create_engine(self.__connection_string) return engine def get_engine(self): return self.__engine def __enter__(self): session_make = sessionmaker(bind=self.__engine) self.session = session_make() return self def __exit__(self, exc_type, exc_val, exc_tb): self.session.close()
排查与解决步骤
确认MySQL服务是否运行
Linux系统执行:systemctl status mysql若未运行,启动服务:
systemctl start mysqlWindows系统:打开「服务」面板,找到MySQL服务,确认状态为「正在运行」,未运行则右键启动。
验证MySQL端口监听状态
检查3306端口是否被MySQL占用:
Linux执行:netstat -tulpn | grep 3306Windows执行:
netstat -ano | findstr :3306若没有输出,说明MySQL未监听3306端口,需修改MySQL配置文件(
my.cnf/my.ini)中的port参数为3306,重启服务。检查用户连接权限
root用户可能默认仅允许通过本地socket连接,需授权其TCP连接权限:
登录MySQL客户端后执行:GRANT ALL PRIVILEGES ON clean_database.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'root'; FLUSH PRIVILEGES;若需要远程连接可替换
127.0.0.1为%,但生产环境不建议。排查防火墙拦截
临时关闭本地防火墙测试:
Linux:systemctl stop firewalldWindows:打开「Windows Defender防火墙」,临时关闭或添加3306端口的入站允许规则。
修正连接字符串
强制使用TCP连接,将连接字符串中的localhost替换为127.0.0.1:self.__connection_string = 'mysql+pymysql://root:root@127.0.0.1:3306/clean_database'手动验证连接
使用MySQL客户端手动测试连接,确认账号、密码、数据库存在:mysql -h 127.0.0.1 -P 3306 -u root -p登录成功后执行
SHOW DATABASES;,确认clean_database存在。
内容的提问来源于stack exchange,提问作者Lerema

