写数据库连接这块,我踩过的坑比很多人写过的代码都多。早些年用Java连Oracle,光是配驱动、调classpath就能耗掉半天,后来转Python,第一次用连本地库,三行代码搞定,当时差点没把咖啡喷屏幕上。Python接入数据库这事儿,说难真不难,但说简单吧,里头弯弯绕绕也不少。今天就把我从入门到被坑再到精通的实战经验,全掰开揉碎讲给你听。

先聊最基础的,这是Python自带的模块,零依赖,适合练手和做小工具。连接代码就两行:,然后。注意,如果文件不存在,它会自动创建,这既是优点也是隐患——你拼错路径,它不会报错,直接给你建个新库,等数据写进去才发现找不着,那叫一个酸爽。我建议连接后立刻打印,确认连的是不是你想连的库。还有一点,sqlite默认不检查外键约束,你得手动执行,不然删数据时数据孤儿满地跑,查起来哭都来不及。
再往上一层,就是生产环境用得最多的MySQL和PostgreSQL。连接MySQL推荐,纯Python实现,装起来省心。但有个大坑:字符集。默认连接可能是latin1,中文全变问号。我当年第一次用pymysql查中文数据,返回一堆,差点以为数据坏了。正确姿势是连接参数里明确写,同时建表时也指定,双保险。PostgreSQL那边用,这个库性能好,但安装时经常编译报错,尤其是Windows上。别硬刚编译,直接装预编译版,省事。连PG的时候注意schema问题,默认是public,如果你用了自定义schema,必须在连接参数或SQL里显式指明,不然表找不到,报错信息还特别隐晦,说什么relation does not exist,排查半天才发现是schema没切。
说到连接池,这是从入门到精通的分水岭。很多人写脚本,每次操作数据库都一次,用完,单线程跑着没问题,一旦上并发,数据库连接数直接被打爆。MySQL默认最大连接数才151,你开200个线程同时连,后面51个全排队,报。我一开始也这么干,后来被DBA骂了一顿才学乖。用连接池,推荐里的,或者直接用的配合参数。连接池的核心思想是复用,程序启动时创建一批连接放着,谁用谁取,用完还回去,这样并发再高,实际连接数也就池子那么大。具体配置,,意思是基础10个,高峰最多再扩20个,够绝大多数场景用了。
事务处理是另一个容易翻车的地方。Python的数据库驱动默认是自动提交,也就是每条SQL执行完立即生效。但业务场景往往需要多条SQL要么全成功要么全失败,比如转账扣款和加款必须原子操作。这时候你得关闭自动提交,手动控制。以pymysql为例,,然后正常执行SQL,提交,如果中途出错就回滚。有个细节:异常处理里必须把rollback写在except块的第一行,别先关连接再回滚,那样回滚就失效了。我见过有同事在finally里调rollback,等于没回滚,数据半截入库,对账对到怀疑人生。
再说说参数化查询,这个必须养成肌肉记忆。千万别用字符串拼接SQL,比如,这等于把数据库大门敞开让黑客随便进。SQL注入不是开玩笑的,我见过一个内部系统因为拼接参数,被人用把整个用户表拖走了。正确做法是用占位符,pymysql用,psycopg2用,sqlite3用。比如,驱动会自动处理转义和类型转换,安全又省心。注意别把参数直接塞进SQL字符串里,要作为第二个参数传给execute方法。
连接参数管理也是门学问。很多人把数据库地址、用户名、密码直接硬编码在代码里,然后代码传到Git仓库,密码就泄露了。我建议用环境变量或者配置文件,比如文件配合读取。再进阶一点,用统一管理,但不要把真实密码提交到版本控制里,用忽略掉。还有,连接超时和读写超时一定要设置,不然数据库挂了,你的程序会卡在连接上半天不报错,看起来像死循环。pymysql可以在connect时传,超时直接抛异常,方便快速失败和重试。
说说性能调优,这是精通的一公里。批量插入千万别一条条execute,几千条数据能跑几十秒。用,一次传一个列表,性能提升几十倍。查询方面,懒加载和分页是好朋友,别一次性把全表拉内存里,数据量大直接OOM。用分页,或者游标逐批取。还有个容易被忽略的点:索引。Python侧没法建索引,但你得会看执行计划,用检查查询是否走了索引,没走就赶紧加。我优化过一个慢查询,加了复合索引后从2秒降到30毫秒,那种成就感比写一百行业务代码都爽。
写到这里,Python连数据库的骨架算是给你搭起来了。从sqlite3的轻量起步,到pymysql和psycopg2的实战,再到连接池、事务、安全、性能这些进阶话题,每一步都有坑,但每一步也都有迹可循。你不需要一次全记住,遇到问题回来翻翻这篇文章,对照着排查就行。记住一句话:Python连数据库不难,难的是稳定、安全、高效地连。把这六个字刻在脑子里,你离精通就不远了。


