
本文详解如何使用 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 文件管理凭证:
露阳PHP企业系统1.0下载1.) 将所有文件解压到php环境中,本程序才用smarty+php+mysql设计。如果运行不了,请修改hhy文件夹下的smarty.php文件改法请看说明2.) 修改configs下的config.inc.php下的连接数据库的密码和用户名3.) 本程序没有做安全页面,人工导入sql.inc到mysql数据库。管理员初始化帐号为admin,密码为hhy。后台地址:http://你的网站地址/h
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。









