python如何连接mysql数据库:借助pymysql库完成本地数据库连通实操
前段时间写数据自动化录入脚本,硬生生卡在python如何连接mysql数据库这个基础操作上,本来以为是几分钟就能搞定的小事,结果前后耗了快两个小时,各种报错弹窗跳出来,心态直接崩了,最后一步步排查问题,才摸透了完整的实操流程,没有花里胡哨的操作,全是实打实能跑通的步骤。
最开始完全没理清前置条件,直接打开代码编辑器写连接语句,运行的第一秒就报了模块不存在的错误。当时脑子懵的,压根忘了python原生是不支持直连MySQL的,必须依赖第三方库,随手搜了教程就pip install mysql,装完之后还是报错,后来才反应过来,现在新版python根本不用这个旧库,主流能用的只有pymysql,白白浪费了十几分钟,做了无用功。
重装pymysql库之后,终于没有模块报错了,新的问题又立马冒了出来。
照着网上的通用代码敲完连接逻辑,运行后持续提示连接失败,反复核对代码语法完全没问题,就是连不上数据库。折腾好久才搞明白,问题全出在参数细节上,本地MySQL默认端口是3306,很多教程偷懒不写端口参数,我跟风省略之后,程序没办法匹配端口,自然无法建立连接,除此之外,数据库用户名默认是root,密码是自己当初安装MySQL时设置的自定义密码,不是默认空密码,之前图省事填了空值,这也是核心报错原因,一堆细小的参数纰漏叠在一起,直接卡死了整个流程,怎么运行都不通。
改完账号、端口、密码这些基础参数后,连接终于成功了,但新的bug又出现了,往数据库写入中文数据的时候,全部变成了乱码问号。当时盯着屏幕看了半天,完全想不通哪里出了问题,代码能连库、能查询纯英文数字数据,就是中文编码异常,翻了好多实操案例,才发现连接语句里必须指定charset编码为utf8mb4,不能只写utf8,普通utf8不支持部分特殊字符和emoji,只有utf8mb4才能适配MySQL所有中文场景,这是很多基础教程都会漏掉的细节,也是新手最容易踩的坑。
搞定编码问题后,完整的连接、查询、写入操作都能正常运行了。其实整套连接逻辑特别简单,导入pymysql模块后,用connect方法绑定主机、端口、用户名、密码、数据库名和编码,再创建游标对象,就能执行各类SQL语句,完成增删改查操作,所有数据操作结束后,再依次关闭游标和数据库连接就行,全程就这一套固定流程,没有复杂的逻辑嵌套。
实操的时候还犯了一个很蠢的错,每次执行完数据操作都忘记关闭连接,反复运行脚本几次后,MySQL直接提示连接数过多,拒绝新的访问。
后面慢慢摸索才知道,数据库的连接资源是有限的,不主动关闭的话,闲置连接会一直占用系统资源,累积多了就会导致后续连接失败,所以不管代码是否报错,都必须用close()关闭游标和数据库连接。稳妥一点的写法,还可以用with语句自动管理连接生命周期,不用手动写关闭代码,能规避大部分资源溢出的问题,这个简便写法也是我那次实操最后才加上的,实用性特别强,能省掉很多后续排查麻烦。
那天调试完所有问题,跑通完整脚本的时候,已经是深夜十点多,关掉编辑器,随手把调试好的完整代码片段存到了桌面的笔记文档里。