
本文详解如何使用 pandas 的 `read_sql()` 和 sqlalchemy 建立 mysql 连接,解决“access denied for user 'root'@'localhost' (using password: no)”等常见认证错误,并提供可复用的连接模板与安全实践。
在 Pandas 中直接连接 MySQL 并非通过原生 mysql.connector 或 pymysql 的游标(如 connection.cursor())操作,而是依赖 SQLAlchemy 引擎作为底层连接桥梁,再配合 pandas.read_sql() 或 DataFrame.to_sql() 实现数据读写。你遇到的 OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: NO)") 错误,核心原因并非 Pandas 本身,而是 MySQL 认证配置问题:MySQL 服务当前尝试以用户 root、空密码方式登录本地实例,但该账户实际设置了密码(如 'Antimk'),而连接字符串中未正确传递或大小写/字段名有误(注意:Django 配置中 'Password' 应为 'PASSWORD' —— MySQL 连接参数对键名敏感)。
✅ 正确做法如下:
-
修正连接参数命名与格式
SQLAlchemy 的 MySQL 连接 URL 格式为:mysql+pymysql://
: @ : / ?charset=utf8mb4 注意:
- 使用小写 password(不是 Password);
- 端口 port 默认为 3306,若为空需显式省略或设为 3306;
- 推荐使用 pymysql(纯 Python 驱动,免编译)或 mysqlclient(C 扩展,性能更优)作为方言驱动。
-
安装依赖(如未安装)
露阳PHP企业系统1.0下载1.) 将所有文件解压到php环境中,本程序才用smarty+php+mysql设计。如果运行不了,请修改hhy文件夹下的smarty.php文件改法请看说明2.) 修改configs下的config.inc.php下的连接数据库的密码和用户名3.) 本程序没有做安全页面,人工导入sql.inc到mysql数据库。管理员初始化帐号为admin,密码为hhy。后台地址:http://你的网站地址/h
pip install pandas sqlalchemy pymysql
-
安全连接示例(推荐使用连接池与上下文管理)
import pandas as pd from sqlalchemy import create_engine from urllib.parse import quote # 对密码进行 URL 编码(避免特殊字符导致解析失败) password = quote("Antimk") # 如密码含 @ / : 等,必须编码 engine_url = f"mysql+pymysql://root:{password}@localhost:3306/test?charset=utf8mb4" # 创建引擎(production 中建议设置 pool_size, max_overflow 等) engine = create_engine(engine_url, echo=False) # echo=True 可调试 SQL try: # 读取数据 df = pd.read_sql("SELECT * FROM users LIMIT 10;", engine) print(df.head()) # 写入数据(示例) # df.to_sql('new_table', engine, if_exists='replace', index=False) except Exception as e: print(f"数据库操作失败:{e}") finally: engine.dispose() # 显式关闭连接池(尤其在脚本结尾)
⚠️ 关键注意事项:
- 绝不硬编码密码:生产环境应使用环境变量(os.getenv("MYSQL_PASSWORD"))或配置文件(.env + python-decouple);
- Django 配置中的 'Password' 是 Django 特定键名,SQLAlchemy 不识别——务必使用标准 URL 参数;
- 若仍报错 Access denied,请确认:
• MySQL 服务已启动:sudo systemctl status mysql(Linux)或检查 MySQL 安装服务;
• 用户权限是否允许本地登录:执行 SELECT User, Host FROM mysql.user;,确保存在 'root'@'localhost';
• 密码是否正确:可通过 mysql -u root -p 命令行验证;
• 是否启用了 auth_socket 插件(Ubuntu 默认)?可改用 mysql_native_password:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Antimk'; FLUSH PRIVILEGES;
总结:Pandas 本身不处理数据库连接,它依赖 SQLAlchemy 提供统一接口。解决连接失败,首要排查 MySQL 认证配置与连接字符串语法一致性;其次确保驱动可用、密码安全传递;最后结合异常处理与资源释放,构建健壮的数据管道。









