Python3使用SQLAlchemy连接本地MySQL报1045访问被拒错误求助
问题根因
你遇到的1045访问拒绝错误,核心原因是SQLAlchemy连接字符串格式写错,导致连接参数解析异常:
- 你的原连接串为
mysql+pymysql://root:root@localhost/db?host=localhost?port=3308,URL规则中查询参数以第一个?为起始标识,后续多个参数必须用&分隔,你在port参数前重复使用?,直接导致port参数未被正确识别,pymysql实际会用MySQL默认端口3306发起连接,而非你指定的3308端口。 - 如果你本机3306端口运行的是其他MySQL实例(比如预装的MariaDB、Docker容器中的MySQL服务),该实例的root密码并非你设置的"root",自然会返回密码错误的1045报错。
- 额外的不规范点:按照SQLAlchemy的URL规则,host、port属于连接地址段的固定部分,不需要放到查询参数中重复定义,冗余参数也可能引发解析逻辑异常。
修复方案
- 首先修正连接字符串为标准格式,直接将端口写在host后方,去掉冗余的查询参数:
# 确认你的MySQL服务运行在3308端口、目标库名为db时,用该写法 engine = create_engine("mysql+pymysql://root:root@localhost:3308/db", echo=True) - 验证端口正确性:
- Windows系统执行命令
netstat -ano | findstr "3308",Mac/Linux系统执行lsof -i:3308,确认3308端口确实有MySQL服务处于监听状态,避免出现端口记错的情况。如果实际服务运行在默认3306端口,把连接串里的3308改成3306即可。
- Windows系统执行命令
- 若修正连接串后仍报错,排查MySQL用户权限配置:
- 用MySQL Workbench成功登录后,执行以下SQL查看root用户允许的登录来源:
SELECT user, host FROM mysql.user WHERE user='root'; - 如果返回结果中root对应的host值没有
localhost,执行以下SQL完成授权并刷新权限:GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'root'; FLUSH PRIVILEGES; - 可以临时把连接串中的
localhost换成127.0.0.1测试连通性,MySQL中localhost默认走Unix socket连接、127.0.0.1走TCP连接,二者权限独立,若换127.0.0.1能连通,说明是socket连接对应的权限配置有误。
- 用MySQL Workbench成功登录后,执行以下SQL查看root用户允许的登录来源:
内容的提问来源于stack exchange,提问作者pyspark
相关产品推荐
相关产品推荐

