ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python连接MySQL完整指南:开发工具、环境搭建与连接池实战

Python连接MySQL完整指南:开发工具、环境搭建与连接池实战 学Python的第一周最让人兴奋也最让人抓狂的节点是什么我觉得是“能读到数据库里的数据”那一刻。抓狂是因为环境搭建这件事看似简单实际全是细节开发工具选哪个Python和MySQL怎么装才不给自己挖坑代码写对了为什么还是连不上。这篇是这个学习记录系列的第一篇标题很直白——先把开发工具定了再把MySQL连上。我尽量把新手阶段该知道的、踩过的坑都写清楚适合刚装好Python、想拿真实数据练手的朋友。1. 开发工具怎么选VSCode当编辑器数据库客户端当观察窗1.1 编辑器与IDE之争新手阶段真的没必要一上来就上重型工具先说结论学习阶段主力编辑器用VSCode就够了。很多朋友一入Python就被推荐PyCharm我也用过确实是个好IDE社区版免费功能完整。但问题在于它“重”启动慢、索引时间长、界面元素多新手一打开满屏英文按钮反而容易焦虑。VSCode的好处是轻、快、插件化装一个Python扩展后写代码、调试、跑脚本一点不差而且以后你写爬虫、写数据处理脚本、写FastAPI接口它可以一套通吃不用来回切换工具。不过我要强调一点工具没有绝对的好坏只有适不适合。如果你之前写过Java、喜欢IDE全家桶的沉浸感那PyCharm社区版也完全可以。但如果想“打开就能写、写完就能跑”的轻量体验VSCode是更稳妥的选择。安装VSCode之后有几个事情必须做在扩展市场搜索并安装“Python”扩展由微软官方发布这是核心。顺手安装“Pylance”它是Python语言服务器补全、类型提示、报错提示都靠它和Python扩展搭配使用体验最好。按CtrlShiftP打开命令面板输入Python: Select Interpreter选择你后面要创建的那个虚拟环境路径。很多新手在VSCode里能写代码但一运行发现用的是系统自带的Python路径装的库全找不着这就是解释器没选对。这一步其实比编辑器本身更重要。1.2 数据库客户端连MySQL之前先有一个能“看见”数据的窗口开发工具不止代码编辑器还有数据库管理的“观察窗”。Python代码里连MySQL你可以在写完SQL后用代码打日志看结果但调试效率太低。我建议本地装一个数据库客户端用来直接查看库表结构、手动执行SQL、验证账号权限。新手阶段常用的是这三种客户端是否免费跨平台适合人群MySQL Workbench免费Windows/macOS/LinuxMySQL官方工具安装MySQL时通常自选功能完整但界面略重DBeaver Community免费开源Windows/macOS/Linux通用数据库工具支持MySQL、PostgreSQL、SQLite等多种库体验轻快Navicat收费Windows/macOS功能强大、界面友好但不建议一开始就折腾破解直接用社区版替代足够我个人推荐DBeaver Community因为它免费、跨平台而且除了MySQL以后你接触SQLite、PostgreSQL也能继续用不用为了不同数据库装一堆工具。Navicat确实是好东西但没必要为一个学习项目去碰破解社区里免费方案完全够用。数据库客户端解决的是“数据库长什么样”的问题Python解决的是“怎么用代码操作数据”的问题分工明确。2. Python环境准备安装步骤与虚拟环境一个都不能少2.1 官网下载与安装勾选Add to PATH比什么教程都关键Python的安装路径选择看似简单但80%的新手坑都出在环境变量上。到Python官网python.org/downloads下载Windows安装包双击运行后第一步要勾选最底部的“Add Python to PATH”。这个勾如果不打安装完你在命令行敲python会提示“不是内部或外部命令”然后就得手动去改环境变量对新手极其不友好。如果已经装完才想起来没勾选或者你用的是从别处拿的安装包可以先检查一下按WinR输cmd打开命令行输入python --version pip --version如果提示找不到说明PATH没有配好。解决办法是手动找到Python安装目录比如C:\Users\你的用户名\AppData\Local\Programs\Python\Python313\把它和它的Scripts子目录都加到系统环境变量的Path里。麻烦一次之后后面就顺了。另外说明一点以后写Python脚本能不用python3就不用python3Windows下要用pythonmacOS/Linux下才是python3。这不是玄学是系统自带的Python版本冲突问题养成按平台使用命令的习惯能少踩不少坑。2.2 虚拟环境第一天就养成的习惯能救你后半程Python新手最容易忽视、也最容易在两周后被坑哭的一个概念就是虚拟环境。通俗讲虚拟环境就像宾馆里的独立房间每个房间的设施依赖包互不干扰。你在项目A里装了requests 2.30不会影响项目B里必须用requests 2.29的脚本。如果不建虚拟环境所有包都塞进同一个全局目录版本冲突只是时间问题。创建虚拟环境的操作很简单。进入你的项目目录后执行# Windows python -m venv venv # macOS / Linux python3 -m venv venv然后激活它# Windows venv\Scripts\activate # macOS / Linux source venv/bin/activate激活成功后命令行前面会出现(venv)字样这时候你用pip install装的任何库都只存在于这个项目的虚拟环境里。如果哪一天项目毁了直接把venv文件夹删掉重建就行系统Python环境依然是干净的。VSCode里要同步切换到这个虚拟环境命令面板里选择Python: Select Interpreter找到刚才创建的venv路径下那个python.exe。这个细节做到了后面所有安装库、运行脚本的操作才会在同一个环境里进行。3. 本地MySQL搭建安装、建库、分配权限别踩坑3.1 MySQL 8安装流程与关键选项默认配置会给你埋雷MySQL安装本身不算难难在有几个预先埋好的雷。先从官网下载MySQL Installermysql-installer-community-8.0.x.msi安装类型建议选“Server only”这样不会装一堆你用不到的组件安装速度也快。安装过程中会让你设置root密码这里必须牢记因为连接数据库时要用它做管理员验证。MySQL 8默认用户认证插件是caching_sha2_password这是它的安全强化升级但也直接导致了Python连接时的经典报错pymysql.err.OperationalError: (2059, Authentication plugin caching_sha2_password cannot be loaded)。这不是你的代码错了是MySQL 8的认证方式太新驱动或客户端版本跟不上。后面第4章我们会专门处理。安装完成后验证服务是否启动很重要。Windows下可以按WinR输入services.msc找到MySQL80服务查看状态是否是“正在运行”。Linux下用systemctl status mysqld如果没启动直接启动它# Windows net start MySQL80 # Linux systemctl start mysqld还有一个坑是端口占用。MySQL默认端口是3306如果你的电脑上有其他程序占用了这个端口服务会启动失败。排查端口占用可以用# Windows netstat -ano | findstr :3306 # macOS / Linux lsof -i:3306看到结果里有进程LISTENING说明端口被占了要么改那个程序要么在MySQL安装配置里换个端口比如3307。3.2 建库建用户别用root账号写业务代码数据库装好、服务跑起来之后第一件事不是急着写Python而是先建一个专用数据库和专用用户。为什么要这样root是MySQL超级管理员权限大到可以删全库。你写的业务代码一旦有个SQL注入漏洞或者手滑执行了危险操作用root跑就会造成不可挽回的后果。给项目单独建一个账号只赋予它这一个库的权限风险就完全被隔离了。登录MySQL命令行mysql -u root -p然后执行CREATE DATABASE IF NOT EXISTS python_demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER py_userlocalhost IDENTIFIED WITH mysql_native_password BY Py123456; GRANT ALL PRIVILEGES ON python_demo.* TO py_userlocalhost; FLUSH PRIVILEGES;这里有个细节要重点讲第二行创建用户时我刻意加了IDENTIFIED WITH mysql_native_password。这是为了绕开MySQL 8默认的caching_sha2_password认证插件让PyMySQL这类纯客户端能直接连上。如果你安装过cryptography这个库PyMySQL也能支持新认证但对新手来说直接用老插件最省事、最稳定。还要提醒一点MySQL 8的密码策略默认比较严创建用户时如果密码太简单比如只有字母没有数字和特殊符号会直接报ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。所以密码至少要8位且包含大小写字母、数字和特殊符号。建完以后退出root用这个专用账号试一下mysql -u py_user -p python_demo能登进去看到命令行变成mysql就说明账号OK。顺便在客户端工具比如DBeaver里用同样账号连一次确认连通后数据库端的工作就全部准备完了。4. Python连MySQL全流程从最小连接代码到增删改查4.1 驱动选型为什么用PyMySQL而不是官方连接器Python连MySQL最主流的两种驱动是PyMySQL和mysql-connector-python。很多教程会劝你用官方版理由是更规范、和MySQL服务端兼容性有保障。但现实是官方连接器在某些环境下一上来就报SSL连接错误处理起来比较折腾。而PyMySQL是纯Python实现的安装简单、社区教程多、踩坑资料也多学习阶段用它是完全够用的。安装也很直接在刚才激活的虚拟环境里执行pip install pymysql如果网络比较慢或者超时可以临时换用国内镜像源pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple安装完以后可以顺便验证版本pip show pymysql看到版本信息就说明OK了。4.2 最小可运行连接代码跑通第一步比啥都重要连接MySQL的最小代码其实非常短我建议你先把下面这段跑通再往下加逻辑import pymysql connection pymysql.connect( host127.0.0.1, userpy_user, passwordPy123456, databasepython_demo, charsetutf8mb4 ) try: with connection.cursor() as cursor: cursor.execute(SELECT VERSION()) result cursor.fetchone() print(MySQL version:, result[0]) finally: connection.close()先解释参数host写成127.0.0.1不要写localhost。原因在于localhost在部分系统上会解析为IPv6的::1而MySQL服务端只监听了IPv4就会没事报连接失败改成127.0.0.1能绕开这个问题。user/password用第3章创建的那个专用账号别用root。database指定连接到哪个库。charset要写utf8mb4它才是完整的UTF-8能存Emoji等四字节字符。写utf8在MySQL里实际是utf8mb3对中文没太大问题但存不了部分特殊字符新手直接用utf8mb4最稳。这段代码跑通后你会看到类似MySQL version: 8.0.x的输出。这个输出意味着Python和MySQL之间的路已经通了。4.3 参数化查询与事务提交不能只会简单的SELECT连接通了以后常规的增删改查逻辑是躲不掉的。我直接给你一个完整的CRUD示例包含插入、查询、更新、删除。先建一张测试表你在DBeaver或者命令行里执行即可CREATE TABLE IF NOT EXISTS user_info ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, city VARCHAR(50) DEFAULT , created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );然后写Pythonimport pymysql connection pymysql.connect( host127.0.0.1, userpy_user, passwordPy123456, databasepython_demo, charsetutf8mb4 ) # 插入 with connection.cursor() as cursor: sql INSERT INTO user_info (name, city) VALUES (%s, %s) cursor.execute(sql, (张三, 上海)) connection.commit() # 查询 with connection.cursor() as cursor: cursor.execute(SELECT id, name, city FROM user_info) rows cursor.fetchall() for row in rows: print(row) # 更新 with connection.cursor() as cursor: sql UPDATE user_info SET city %s WHERE name %s cursor.execute(sql, (北京, 张三)) connection.commit() # 删除 with connection.cursor() as cursor: sql DELETE FROM user_info WHERE name %s cursor.execute(sql, (张三,)) connection.commit() connection.close()这一段有几个关键点必须说清楚也是新手最容易犯的错。第一参数化查询。上面SQL中全部用%s占位符把参数单独传给execute坚决不要用字符串拼接去构造SQL。新手自己写着方便字符串插值一拼代码似乎是可读的但这就是SQL注入的温床。拼SQL一旦拼错调试极痛苦维护也是一种折磨。第二事务提交。PyMySQL默认开启事务但不会自动提交。你执行了INSERT、UPDATE、DELETE之后必须调用connection.commit()数据才会真正落到表里。很多人写完了 SELECT 没问题写 INSERT 以后却发现表里没数据找半天原因多半就是忘了 commit。第三资源释放。上面的代码里用了with connection.cursor()语法它能在代码块结束时自动关闭cursor。但connection还是要手动close。想省心一点可以把连接放到with里with pymysql.connect(...) as conn: with conn.cursor() as cursor: ...这样连接也会自动关。不过要提醒一句用with自动管理连接前面的commit不能省Python不会在退出时自动帮你提交事务。5. 生产级连接管理连接池和配置项别让代码裸奔5.1 为什么需要连接池每次新建连接的开销比想象中大每次连MySQL都要经历TCP握手、身份认证、权限检查这整套流程耗时可能只要几十毫秒但在高并发或频繁调用的场景下积少成多就会拖垮性能。更不提每次新建连接都可能在数据库端留下一些资源占用连接一多还没及时释放数据库就会被拖死。打个比方你不用连接池就像每次去银行办事都重新排队叫号办完一个号就关一个窗口用了连接池等于固定开几个柜台大家轮着用窗口始终是热的。Python中最常用的连接池是DBUtils它跟你用的驱动搭配起来很简单pip install dbutils5.2 用PooledDB管理MySQL连接参数要理解别光跑通DBUtils提供的PooledDB可以从多个连接中复用而不是每次重新创建。示例代码from dbutils.pooled_db import PooledDB import pymysql pool PooledDB( creatorpymysql, maxconnections10, mincached2, maxcached5, blockingTrue, ping1, host127.0.0.1, userpy_user, passwordPy123456, databasepython_demo, charsetutf8mb4 ) connection pool.connection() try: with connection.cursor() as cursor: cursor.execute(SELECT 1) print(cursor.fetchone()) finally: connection.close()参数含义分别是maxconnections连接池允许的最大连接数超出的请求会等待还是报错取决于blocking。mincached启动时就预先创建的空闲连接数。maxcached空闲连接池中最多保留的连接数超过的部分会被关闭释放。blockingTrue连接数达到上限时新请求排队等待而不是直接报“连接数已达上限”。ping1每次从池中取连接时检查连接是否存活防止拿到一个已经被动关闭的假连接。实战中我建议把maxconnections和实际业务并发评估好别拍脑袋写50。数据库本身的连接数也有限制连接池开得过大反而会造成资源浪费。连接用完记得connection.close()这里close不是真的断开而是把连接归还给连接池这样下次还能复用。另外要给一个忠告连接参数host、user、password不要直接硬编码在代码里实战环境用配置文件或者环境变量管理更合适。比如建一个config.pyDB_CONFIG { host: 127.0.0.1, user: py_user, password: Py123456, database: python_demo, charset: utf8mb4, maxconnections: 10 }后续项目里直接从配置文件里读取改库、改密码时不用动业务代码。6. 连接异常排查照着这张表能省一晚上时间6.1 高频报错速查表从报错入手定位问题连接MySQL踩坑是每个Python学习者一定会经历的事。我第一次把环境搭好卡在认证插件上接近一整个晚上后来总结了一张速查表遇到问题直接按图索骥效率高很多报错关键字原因解决办法Cant connect to MySQL server on 127.0.0.1 (2003)MySQL服务没启动或端口不对确认服务已启动netstat或lsof查端口监听文件确认是否是3306Access denied for user (1045)用户名、密码错误或账号权限不足检查用户名密码是否一致确认该账号授权了目标库Authentication plugin caching_sha2_password cannot be loaded (2059)MySQL 8默认认证插件与PyMySQL不匹配建用户时用IDENTIFIED WITH mysql_native_password或安装cryptography库SSL connection error驱动或服务端SSL协商失败常见于老驱动或非标准SSL配置连接参数里加ssl_disabledTrue或升级PyMySQL版本Lost connection to MySQL server during query (2013)查询超时、网络中断、或连接空闲过久被服务端断开检查网络、调整read_timeout、连接池或者SQL执行时间Unknown column xxx in field listSQL拼接或语义错误字段名不存在先在数据库客户端手动执行SQL确认字段名和表名正确6.2 自查步骤按顺序来别一上来就怀疑Python代码排查顺序很重要我强烈建议按下面这个逻辑来可以避免很多无效尝试。第一步确认数据库服务本身是好的。用DBeaver或命令行先连一次MySQL如果客户端也连不上那问题在数据库端服务没启动、端口被占、账号密码不对。这时候跟Python无关别在代码里瞎改。第二步确认Python环境是对的。检查虚拟环境是否激活检查pymysql是否真的装在这个虚拟环境里。你可以在Python里直接打印import pymysql print(pymysql.__version__)如果这里报ModuleNotFoundError说明你在全局环境里运行代码但你要求的包在虚拟环境里或者根本没装上。第三步从代码最小化做单点验证。把连接代码简化为第4章那个最小示例先连接、查版本不涉及业务SQL。如果最小示例能跑通问题大概率出在SQL语句或业务逻辑上如果最小示例也报错就对照速查表排查。第四步看报错关键行。Python报错信息往往是多层堆栈新手容易看花眼。你只需要看最后一行的pymysql.err.OperationalError或pymysql.err.ProgrammingError后面的括号内容比如(1045, Access denied...)那个数字才是关键诊断信息。还有一个常见但不被注意的小坑host写成localhost导致连不上换成127.0.0.1就好了。这不是什么玄学就是IPv6解析的问题前面也提到过。记住这一个点能帮你少踩一次坑。数据库连接这件事说到底是“工程习惯”的问题。环境隔离、账号权限、连接池、参数配置这些东西新手阶段看起来多余等你自己写一个稍微像样的项目时全部都会用得上。我第一次连MySQL时卡在认证插件上接近一整个晚上后来才意识到问题根本不在代码而在建用户时用的认证方式。所以遇到连不上先别急着怀疑Python按服务、账号、端口、驱动这个顺序排查多半能快速定位。这个系列我会继续记录后面的内容下一步大概率是数据操作、面向实际场景的查询优化以及在Web项目里怎么管理数据库连接。但不管走多远今天的这个地基一定要打牢。
返回列表