
本文详解如何使用 pandas 的 `read_sql()` 或 `to_sql()` 与 mysql 建立连接,重点解决常见认证错误(如“access denied for user ‘root’@’localhost’ (using password: no)”),并提供基于 sqlalchemy 的标准连接方式、密码安全实践及完整可运行示例。
在 Pandas 中直接连接 mysql 并非通过原生 mysql.connector 或 pymysql 的游标对象(如 connection.cursor())实现,而是依赖 SQLAlchemy 引擎作为底层连接桥梁。Pandas 的 read_sql()、read_sql_query() 和 to_sql() 等函数均要求传入一个 sqlalchemy.Engine 实例,而非原始数据库连接或游标。
✅ 正确连接方式(推荐使用 SQLAlchemy + pymysql)
首先安装必要依赖:
pip install pandas sqlalchemy pymysql
然后按以下方式构建连接 URL(注意字段大小写敏感):
from sqlalchemy import create_engine import pandas as pd # ✅ 正确:URL 格式为 mysql+pymysql://user:password@host:port/database engine = create_engine( "mysql+pymysql://root:Antimk@localhost:3306/test", connect_args={"init_command": "SET sql_mode='STRICT_TABLES'"} ) # 示例:读取数据 df = pd.read_sql("SELECT * FROM users LIMIT 5;", engine) print(df) # 示例:写入数据(需确保表结构兼容) # df.to_sql('new_table', engine, if_exists='append', index=False)
⚠️ 注意事项:USER 和 Password 在 django 配置中是大写键名,但在 SQLAlchemy 连接字符串中必须小写(user/password);错误 access denied for user ‘root’@’localhost’ (using password: NO) 明确表明:MySQL 尝试以空密码登录 root 用户——这通常因连接字符串中未传入密码,或系统 root 密码实际为空但代码却提供了密码导致校验失败;若本地 MySQL root 确实无密码,请使用 “mysql+pymysql://root:@localhost:3306/test”(密码位置留空,但保留冒号);若密码含特殊字符(如 @, /, :),务必用 urllib.parse.quote_plus() 编码:from urllib.parse import quote_plus password = quote_plus(“Antimk@2024!”) engine = create_engine(f”mysql+pymysql://root:{password}@localhost:3306/test”)
? 安全建议(切勿硬编码密码)
-
❌ 不要在代码中明文写密码(尤其避免提交至 git);
-
✅ 推荐使用环境变量或 .env 文件管理凭证:
import os from dotenv import load_dotenv load_dotenv() user = os.getenv("DB_USER", "root") password = os.getenv("DB_PASSWORD", "") host = os.getenv("DB_HOST", "localhost") database = os.getenv("DB_NAME", "test") engine = create_engine(f"mysql+pymysql://{user}:{password}@{host}:3306/{database}")对应 .env 文件内容:
DB_USER=root DB_PASSWORD=Antimk DB_HOST=localhost DB_NAME=test
? 验证连接是否成功
可在创建引擎后快速测试连接有效性:
try: with engine.connect() as conn: conn.execute("SELECT 1").fetchone() print("✅ MySQL connection successful!") except Exception as e: print("❌ Connection failed:", str(e))
总结:Pandas 本身不处理数据库认证,它完全依赖 SQLAlchemy 的统一接口。解决 Access denied 的核心在于——确保连接字符串中的用户名、密码、主机、端口与 MySQL 实际配置严格一致,并优先排查密码是否为空或未正确转义。遵循上述模式,即可稳定、安全、高效地在数据分析流程中集成 MySQL。