说实话,刚开始用Python连MySQL那会儿,我是真崩溃。什么MySQLdb编译不通过,什么缺依赖、少头文件……折腾半天连个数据库都连不上,差点劝退。后来同事给我安利了一个叫PyMySQL的东西,说这玩意儿纯Python写的,不用编译,pip install一把梭就能用。
这货到底是个啥?
PyMySQL说白了就是一个纯Python写的MySQL/MariaDB客户端,完全遵循Python官方那个DB-API 2.0规范(就是PEP 249)。这意味着什么呢?就是说,你以前怎么用sqlite3,现在几乎一模一样的用法来操作MySQL,学习成本接近于零。
它支持Python 3.9及以上版本,连PyPy也能跑。而且不光MySQL,MariaDB也完美兼容——毕竟人家官方文档就写着呢。
为啥我推荐你试试?
其实市面上Python连接MySQL的方案不少,但各有各的毛病:
| | |
| PyMySQL | | |
| mysql-connector-python | | |
| MySQLdb | | 编译麻烦,Python 3支持晚,Windows用户噩梦 |
我觉得PyMySQL最大的优势就是省心。你想想,公司里有人用Mac,有人用Windows,还有用Linux服务器的。要是用MySQLdb,光环境配置就能吵半天。用PyMySQL?一行pip install PyMySQL,完事儿。
装起来有多简单?
真的就这一句:
python3 -m pip install PyMySQL
如果你的MySQL用了sha256_password或者caching_sha2_password这种加密方式(MySQL 8.0默认就是caching_sha2_password),那得装个额外依赖:
python3 -m pip install PyMySQL[rsa]
要是你用MariaDB的ed25519认证,那就:
python3 -m pip install PyMySQL[ed25519]
大部分情况下,普通安装就够用了。
上手代码,真不唬人
我给你写个最简单的例子,连上数据库,插条记录再查出来。假设你有个users表,结构大概长这样:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `email` varchar(255) NOT NULL, `password` varchar(255) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB;
然后Python代码这么写:
import pymysql.cursors# 连上数据库connection = pymysql.connect( host='localhost', user='你的用户名', password='你的密码', database='你的库名', cursorclass=pymysql.cursors.DictCursor # 让结果返回字典,方便)# 用with语句自动管理连接with connection:# 先插入一条数据with connection.cursor() as cursor: sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)" cursor.execute(sql, ('xiaoming@example.com', '123456'))# 注意!PyMySQL默认不自动提交,必须手动commit connection.commit()# 再查出来看看with connection.cursor() as cursor: sql = "SELECT `id`, `email` FROM `users` WHERE `email`=%s" cursor.execute(sql, ('xiaoming@example.com',)) result = cursor.fetchone()print(result)
输出差不多是这样:
{'id': 1, 'email': 'xiaoming@example.com'}
看到没?跟用sqlite3几乎一模一样。唯一容易忘的就是那个connection.commit()——我第一次用的时候就忘了,查了半天为什么数据没写进去,尴尬。
几个小坑,提前告诉你
1. 占位符是%s,不管什么类型就算你插的是整数,也写%s。别问为什么,PyMySQL就是这么设计的。别写成%d,会报错。
2. 默认不自动提交上面说了,记得commit。当然你也可以在connect的时候传autocommit=True,但我建议保持默认,手动控制更安全。
3. 游标记得及时关用with connection.cursor() as cursor就自动关了,别自己写close,容易忘。
性能怎么样?
纯Python实现的读写,肯定比C写的MySQLdb慢一点。但实话实说,对于绝大多数业务系统——比如网站后台、爬虫存数据、数据分析工具——这点差别你根本感觉不出来。除非你每秒要怼几万条,那确实得掂量掂量,换个驱动或者上连接池啥的。
最后说两句
PyMySQL是个成熟又稳定的老牌库了,GitHub上星不少,文档也齐全(https://pymysql.readthedocs.io/)。遇到问题去StackOverflow搜一下,基本都能找到答案。
如果你是刚入门的Python新手,或者被其他MySQL驱动搞到头大,听我一句劝:从PyMySQL开始,别一上来就折腾那些需要编译的玩意儿。等以后真有性能需求了再换也不迟,反正接口都一样,换个import的事儿。
项目地址:https://github.com/PyMySQL/PyMySQL