You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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即可。
  • 若修正连接串后仍报错,排查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连接对应的权限配置有误。

内容的提问来源于stack exchange,提问作者pyspark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:06:25