说实话,我第一次用Python连MySQL的时候,心里是有点发怵的。网上教程铺天盖地,但每个人写的代码风格都不一样,有的用,有的用,还有的推荐这种ORM框架。我照着抄了一段,结果报错信息跟天书似的,什么、,折腾了半小时才反应过来,原来是我密码打错了。这事儿让我明白,Python调MySQL这事儿,看着简单,但坑是真不少。今天我就把自己踩过的坑、试过的路子,捋一遍说给你听。

先说最基础的一步,装驱动。Python本身不带连MySQL的库,你得自己挑一个。我用过,纯Python写的,装起来省事,就完事儿。也试过官方推荐的,功能更全,但安装包大一些,偶尔会有版本兼容问题。如果你用的是Django或者Flask这类框架,可能还会接触到,它不直接连数据库,而是把你写的Python类映射成表结构,好处是换数据库不用改业务代码,坏处是学习曲线陡,刚上手容易懵。我的建议是,别贪多,先选一个用熟了再说。我自己现在常用,轻量、够用。
驱动装好,接下来就是连接。这一步最容易出问题的,不是代码,而是参数。你要知道MySQL服务器跑在哪台机器上,端口默认是3306,用户名密码得有,数据库名得存在。我第一次连的时候,把写成了,结果程序跑在Docker容器里,MySQL跑在宿主机上,死活连不上。后来改成才通。这个坑提醒我,连数据库之前,先确认网络通不通,一下主机,再用测试端口,别一上来就闷头写代码。连接代码就那么几行,但每行都有讲究,比如这个参数,不加的话,存中文可能乱码,加了你才能安心存表情符号。
连接建立之后,你要写SQL语句。这里有个习惯问题,我见过不少人喜欢把SQL直接拼在Python字符串里,比如。这种写法看着直观,但特别危险,万一里面带个单引号,你的SQL就炸了,更严重的是容易被SQL注入攻击。正确的做法是用参数化查询,里就是,把变量作为参数传进去,让驱动帮你转义。这不仅是安全考虑,也是代码规范,养成习惯以后换别的语言写数据库操作,思路都一样。
说完查询,再说说写操作。增删改和查不一样,查完就完了,但增删改会改变数据库状态,所以你得记得。我第一次写插入语句,完事儿,数据没进表,查了半天,才发现忘了提交事务。那感觉,就像你写完一篇文章没保存,电脑突然断电,欲哭无泪。正确的流程是:拿到连接,执行SQL,然后,记得和。有些人图省事,不关连接,程序跑多了,数据库连接数就爆了,报。这跟出门不锁门一个道理,早晚出事。
事务处理这块,值得单独拎出来说。你写一个转账功能,从A账户扣钱,往B账户加钱,两步操作必须同时成功或同时失败。这时候就得用事务。Python里很简单,开始事务,两个都成功就,中间任何一步报错,就回滚。我给你说个真实案例,我之前写一个库存扣减逻辑,没加事务,结果并发请求一上来,库存变成负数了。后来加上事务,再用锁住行,问题才解决。所以别嫌事务麻烦,它是数据一致性的防线。
还有一类问题,是编码和时区。MySQL默认的排序规则和字符集可能不是,你插入一个生僻字,或者一个emoji,直接报。解决办法是在建库的时候指定,连接字符串里也加上。时区问题更隐蔽,MySQL的存的是服务器本地时间,如果你服务器在东八区,应用服务器在UTC,查出来的时间就差了八小时。我吃过这个亏,后来统一在连接参数里加,或者干脆在Python里用转换,省心。
调试代码的时候,有个小技巧,把SQL语句打印出来看。这个属性能拿到实际执行的SQL,包括参数替换后的完整语句。别小看这个,排查问题快多了。另外,支持,查出来的结果每行是一个字典,字段名当键,比默认的元组好用,尤其是字段多的时候,不用数着下标取值。代码就一行:,谁用谁知道。
我想说,Python调MySQL这事儿,不难,但也不简单。难的不是语法,是那些藏在细节里的坑。你写一次,踩一次,记住它,下次就顺了。别怕报错,报错是好事,它告诉你哪里不对。我见过太多人一报错就慌,其实你仔细读读报错信息,大多数都能自己解决。网络、权限、字符集、事务,这四关过了,你基本就入门了。以后不管是用MySQL还是PostgreSQL,思路都是通的。工具是死的,人是活的,多用几次,你就能摸清它的脾气。


