优先选pymysql,因其纯python实现、无依赖、默认适配mysql 8.0的caching_sha2_password认证;mysql-connector-python默认不支持该插件易报错。

用 pymysql 还是 mysql-connector-python?选错库会卡在连接认证上
直接结论:优先选 pymysql,尤其在 Python 3.8+ 和 MySQL 8.0+ 环境下。mysql-connector-python 默认不支持 caching_sha2_password 插件(MySQL 8.0 默认认证方式),容易报错 Authentication plugin 'caching_sha2_password' cannot be loaded。而 pymysql 纯 Python 实现,无依赖、兼容性好,且默认适配该认证方式。
安装命令:
pip install pymysql
常见错误场景包括:本地开发连得上,部署到服务器就报认证失败;或升级 MySQL 后批量插入突然中断——大概率是驱动不匹配导致的连接层异常,而非 SQL 本身问题。
executemany() 批量插入时,参数必须是二维序列,不是字典列表
executemany() 接收的是形如 [(v1,v2),(v3,v4),...] 的序列,不能直接传 [{"name":"a","age":10}, ...]。传错会报 TypeError: not all arguments converted during string formatting 或静默丢数据。
实操建议:
- 用
list(tuple(d.values()) for d in data_list)快速转成元组列表(注意字段顺序必须和 SQL 中INSERT INTO ... (col1,col2)严格一致) - 若字段多或顺序易错,改用
cursor.executemany("INSERT INTO t (a,b) VALUES (%s,%s)", data_tuples),避免拼 SQL 字符串 - 单次
executemany()建议控制在 1000 行以内;超过易触发 MySQL 的max_allowed_packet限制(默认 4MB),报错Packets larger than max_allowed_packet are not allowed
事务没提交 + 自动提交关了 = 数据看似插进去了,其实根本没落盘
PyMySQL 默认关闭自动提交(autocommit=False)。调用 executemany() 后如果不显式 conn.commit(),连接断开或程序退出时数据全部回滚——你查不到,日志也显示“执行成功”,但表里空空如也。
关键操作链必须完整:
- 创建连接时明确设
autocommit=True(适合简单脚本) - 或手动管理事务:
conn.begin()<br>cursor.executemany(...)<br>conn.commit()
- 出错时别忘了
conn.rollback(),否则后续操作可能被挂起
漏掉 commit() 是批量插入“失效”最常被忽略的原因,比语法错误更难排查。
大批量插入慢?别急着换 ORM,先关掉唯一索引和外键检查
真正卡住的往往不是 Python 层,而是 MySQL 的约束校验。插入 10 万行时,每行都校验唯一索引和外键,性能可能差 5–10 倍。
可临时优化(仅限导入期,务必恢复):
- 执行
SET FOREIGN_KEY_CHECKS = 0;和SET UNIQUE_CHECKS = 0;关闭校验 - 插入完成后再执行
SET FOREIGN_KEY_CHECKS = 1;和SET UNIQUE_CHECKS = 1; - 确认表引擎是 InnoDB(MyISAM 不支持事务,关了也没用)
这些 SQL 要通过 cursor.execute() 发送,不是配置项。跳过这步,哪怕用了 executemany(),速度也可能不如单条循环插入。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











