如何在 Pandas 中安全、正确地连接 MySQL 数据库

12次阅读

如何在 Pandas 中安全、正确地连接 MySQL 数据库

本文详解如何使用 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。

text=ZqhQzanResources