
自从开始写 Python 学习记录这个系列我就一直在想第一篇应该从哪讲起。后来发现很多人卡住的第一关根本不是语法而是“工具没装好、数据库连不上”。搜了一圈 python 安装教程、mysql 安装配置教程、navicat for mysql再对照自己的报错信息很容易陷入装了删、删了装的死循环。所以这一篇我打算把开发工具选择和链接 mysql 这条线串起来从“选什么工具”到“代码怎么连”按我自己踩坑的顺序重新梳理一遍给同样在入门阶段的朋友一个可以直接照做的路径。1. 先想明白为什么要学 python 和 mysql 这对组合1.1 这个组合到底能解决什么问题先说一个很现实的问题作为初学者你到处搜“python 量化交易策略代码”“python 爬虫”“javaweb 项目完整案例 mysql”最后会发现所有稍微有点实际意义的例子背后几乎都会出现数据库。Python 负责逻辑处理MySQL 负责把数据存下来。爬虫抓到的内容需要入库网站后端的用户数据需要入库量化策略算出来的结果也需要入库。所以学 Python 的过程中迟早要面对“怎么把自己的程序和一个数据库连起来”这个问题。早点把 MySQL 连接打通后面做任何练习都会顺手很多。另外这两个东西在网络上积累的教程量非常庞大遇到报错搜索引擎一查基本都有前人踩过坑学习路径清晰从安装到连接再到操作每一步都能找到大量参考生态成熟Python 操作 MySQL 的库有好几个社区讨论的热度高对于新手来说选技术栈最重要的还真不是“谁更强”而是“谁有更多现成的坑可以查”。Python 和 MySQL 恰好是这一类。1.2 版本选择上的一些建议我见过不少人在下载的时候纠结到底装 MySQL 5.7 还是 8.0。如果你是一台全新机器直接装 MySQL 8.0 就行别再回头去找 5.7。原因很简单MySQL 8.0 从 2018 年发布到现在已经非常稳定网上大部分新教程都在用它5.7 虽然在很多公司存量环境里还有但对新手学习来说默认密码规则、初始化方式反而让老版本显得更别扭8.0 的默认认证插件是 caching_sha2_password早期确实让很多 pymysql 用户踩过坑但现在的 pymysql 版本已经能兼容Python 这边也一样不用追最新大版本稳定版本就够用。我当时选的 3.10后来换过 3.11、3.12日常写脚本连数据库都没问题。1.3 这一篇的学习目标本篇自己能跑通以下事情就算合格装好 Python并能在终端里运行脚本装好 MySQL 8.0并能启动服务用 Python 的 pymysql 库成功连上 MySQL完成一次查询和一次写入并顺便理解游标、事务这些基础概念后面不管是学框架、做爬虫还是搞量化数据库连接这一步都能直接复用。2. 折腾半天的开发工具VSCode、PyCharm 和 Jupyter 怎么挑2.1 三种工具的定位差异“hermes 配合什么开发工具使用”“swf 和 exe 开发工具”“鸿蒙开发工具连鸿蒙手机”——这些关键词一看就知道大家是真的在工具选择上迷茫过。我自己的想法是Python 开发里不存在“最好的工具”只有“最适合当前阶段的工具”。先给一张很朴素的对照表后面再展开说工具适合场景学习成本资源占用备注VSCode日常脚本、小项目、练手低中插件丰富终端内置一个窗口搞定PyCharm Community纯 Python 项目开发中高自动补全和调试体验好社区版免费Jupyter Notebook数据分析、探索性实验低中适合边写边看结果不适合写正式工程记事本 cmd完全零依赖验证无极低应急用不值得当主力如果你只是想知道“我该装哪个”我直接给答案入门阶段用 VSCode装好 Python 插件和 MySQL 插件就足够了。2.2 为什么我推荐 VSCode 给新人PyCharm 确实很强大但很多新人第一次打开会蒙项目解释器怎么配虚拟环境是什么窗口太多看不明白。相比起来 VSCode 的启动成本低很多打开一个文件夹就能写代码右边点一下运行就能出结果。而且内置终端直接在编辑器里敲命令不用来回切换到 cmd也能在这里跑 python 脚本、敲 mysql 命令插件体系完整装一个 Python 扩展就能获得语法高亮、代码补全、格式化这些基础体验需要操作 MySQL 时还能装 Database Client 类的插件直接在侧边栏看表数据跨平台且免费Windows、macOS、Linux 表现一致换电脑没有任何迁移成本这里插一句热搜里“python 连接 cmd”的困惑。很多新手问这个其实说的是“怎么在 cmd 里运行 python”。这是环境变量 PATH 的功劳python 安装时勾选“Add Python to PATH”之后打开 cmd 输入 python 就能进入交互模式。VSCode 的集成终端和 cmd 原理相同所以不必刻意去记命令行窗口的打开方式知道“在终端里能敲 python xxx.py 运行脚本”就够了。2.3 VSCode 环境配置的操作细节我当时的安装和配置步骤大致是这样的你可以直接抄到 VSCode 官网下载安装包一路 Next 装完打开 VSCode左侧扩展商店搜“Python”安装微软官方出的那个 Python 扩展如果需要看数据库再装一个 MySQL 相关的扩展比如 Database Client其实不装也不影响程序连接按Ctrl ~打开集成终端输入python --version如果能看到版本号说明 Python 解释器和 VSCode 已经对接上了新建一个test.py文件写print(hello mysql)右键选择“在终端中运行 Python 文件”到这里环境算真正通了接下来才进入重点——搭好 Python 本体和 MySQL 服务。3. 从零安装 Python版本、环境变量和验证细节3.1 下载和安装的关键选项Python 官网下载地址很直接进去以后选 Windows installer (64-bit) 就好。版本上我不建议装 3.13 这种刚出没多久的版本因为个别第三方库可能存在兼容问题一般选 3.10 到 3.12 之间的某个稳定版本。我后来给朋友推荐都会说装 3.11 或 3.12配套资料最全。安装时有两个勾选容易被忽略Add Python to PATH必须勾选不然后面没法在 cmd、VSCode 终端里直接用 python 命令Install launcher for all users建议勾上省得权限问题有个小细节我记得安装界面有一个“Customize installation”的入口如果电脑上已经装了旧版 Python可以直接在原目录覆盖升级也可以装成平行版本。作为新手不用搞那么复杂直接装默认路径即可。3.2 验证安装并处理 PATH 问题安装完别急着写代码先在终端确认两件事python --version pip --version如果发现输入python提示“不是内部或外部命令”多半是安装时没有勾选 Add Python to PATH。解决方法有两个重装一遍 Python确保勾选 Add Python to PATH不重装手动把 Python 安装目录和 Scripts 子目录添加到系统环境变量 Path 里这个坑特别常见尤其是从“python 安装教程”视频里照着操作视频里可能一掠而过到自己电脑上就各种卡壳。我个人的建议是直接重装勾选比手动改环境变量省事。3.3 顺手把 pip 源换成国内镜像Python 安装完紧接着要做的一件事是把 pip 源切换到国内镜像。原因没啥好避讳的直接从官方源下载包经常超时换了镜像以后下载速度会快很多。以清华源为例pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple设置完之后再执行pip install pymysql基本几秒钟就装完了。这一步虽然不是必须的但对体验影响很大。我见过太多新手在pip install这一步卡到怀疑人生后来发现仅仅是网络问题。3.4 几个容易忽略的验证小技巧终端里除了看版本还可以快速验证模块安装是否成功python -c import pymysql; print(pymysql.__version__)这条命令会直接输出 pymysql 版本号如果没有报错说明模块已经正确安装到了当前解释器环境里。这里之所以强调“当前解释器环境”是因为很多人电脑上同时装了多个 Python 版本pip 安装的包可能装在另一个解释器里导致 VSCode 里运行代码时找不到模块。遇到这种情况直接在 VSCode 的终端里执行pip install xxx因为终端默认使用的是同一个 Python就不会有这种错位问题。4. MySQL 的安装和初始化8.0 版本最容易踩的几个点4.1 下载、安装与服务启动MySQL 官方下载地址是 MySQL Community ServerWindows 下有两种选择ZIP 包手动配置或者 MSI 安装包。新手走 MSI 最省心。安装过程中有几个点以前让我很头疼这里单独列一下选择安装类型可以选择 Developer Default也可以自定义选 MySQL Server。如果你不想装一堆用不上的组件选 Server only 就行设置 root 密码安装向导会让你给 root 用户设置密码这一步之后用 Navicat、用 Python 连接时都要用这个密码建议记在一个文本文件里认证插件8.0 默认是 caching_sha2_password强烈建议保持默认。曾经确实有版本兼容问题但现在 pymysql 新版已经没问题了不要为了“兼容”去改成 mysql_native_password服务名称默认是 MySQL80后面在 cmd 里启动服务时会用到装完以后打开 Windows 服务管理器找到 MySQL80 服务和状态。如果没启动可以手动启动也可以在终端里执行net start mysql80很多新手连不上数据库最后发现根本不是代码问题而是 MySQL 服务压根没跑起来。4.2 root 密码和可视化工具的取舍安装过程中设置的 root 密码就是你用管理员账号连接数据库时的凭证。我建议安装完立刻试一次连接确认密码没记错本地学习期间不必单独建新用户直接用 root 即可但生产环境千万别这样做可视化客户端方面搜“navicat for mysql”的人很多但如果你只想看数据MySQL 官方自带的 MySQL Workbench 完全够用有一点要提醒现在很多人下载 Navicat 的时候容易搜错下到各种推广的“破解版”或者“全家桶”。我的建议是新手阶段暂缓安装 Navicat先用命令行或者 Workbench 熟悉概念。等建表、查询都熟练了再决定是否需要更顺手的客户端。4.3 建一个测试库为 Python 连接做准备既然目标是用 Python 连接 MySQL那么得先有一个库一张表可以连。打开 MySQL 命令行输入 root 密码进入后执行下面这段 SQLCREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE test_db; CREATE TABLE IF NOT EXISTS user_info ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, age INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO user_info (username, age) VALUES (san, 25), (zhang, 30);这段 SQL 做了三件事建库、建表、插入两行测试数据。编码选 utf8mb4 是为了避免中文显示成问号这个后面写 Python 代码时也要保持对应。执行完以后用SELECT * FROM user_info;看一眼能返回两行数据说明 MySQL 这边准备工作已经全部完成。4.4 端口占用这个老问题MySQL 默认监听 3306 端口。有一类报错是提示端口被占多半是机器上装了多个数据库或者某次安装卸载没干净导致了残留服务。排查方法是在 cmd 里执行netstat -ano | findstr 3306看输出的 PID再去任务管理器确认是什么程序占用。如果确定是残留的 MySQL停掉服务再清理干净即可。这个坑在“rpm 安装 mysql”“windows 安装 mysql 8”的场景里很常见Windows 上尤其要养成“先看端口再看报错”的习惯。5. 用 pymysql 打通 Python 和 MySQL连接代码的完整写法5.1 为什么选 pymysqlPython 连 MySQL 的库有好几个PyMySQL、mysqlclient、MySQL Connector/Python。我之所以推荐 pymysql主要是它对新手友好纯 Python 实现安装即用不需要额外的 C 编译器在 Windows 上安装不会有编译链问题支持 MySQL 8.0 的 caching_sha2_password新版兼容性已经很成熟语法简洁接口清晰mysqlclient 性能更好但 Windows 上安装经常要处理 VC 编译环境对新人来说纯属额外负担。前期练习没必要纠结性能差异。5.2 一个最小的连接示例假设前面已经执行了pip install pymysql先写一个最简单的查询脚本import pymysql conn pymysql.connect( host127.0.0.1, port3306, userroot, password你的root密码, databasetest_db, charsetutf8mb4, ) try: with conn.cursor() as cursor: cursor.execute(SELECT id, username, age FROM user_info) result cursor.fetchall() for each in result: print(each) finally: conn.close()运行后如果看到两行元组说明连接已经成功。这里有几个细节值得展开host 写 127.0.0.1回环地址表示连接本机和 localhost 类似但程序里更推荐写 127.0.0.1可以避免一些奇怪的解析问题charset 必须和库表编码一致库是 utf8mb4Python 这边也写 utf8mb4中文才不乱码conn.close() 放在 finally 里确保连接一定被关闭。虽然脚本跑完进程回收也会释放但从一开始就养成好习惯5.3 执行插入操作游标和事务查询读数据只需要 execute 和 fetch 两个动作但写入数据还涉及事务提交。这是初学者特别容易漏的一个环节。import pymysql conn pymysql.connect( host127.0.0.1, port3306, userroot, password你的root密码, databasetest_db, charsetutf8mb4, ) try: with conn.cursor() as cursor: sql INSERT INTO user_info (username, age) VALUES (%s, %s) cursor.execute(sql, (li, 28)) conn.commit() print(插入成功受影响行数:, cursor.rowcount) except Exception as err: print(发生错误回滚:, err) conn.rollback() finally: conn.close()注意几个关键点%s是占位符不要自己用字符串拼接 SQL那样容易出语法错误更危险的是 SQL 注入。pymysql 的 execute 会自动处理参数转义必须调用 commit()MySQL 默认开启了事务execute 只是把变更发送到数据库会话里没有 commit 不会真正落地异常时 rollback()如果插入过程发生错误回滚可以让数据保持一致避免半截写入的脏数据我见过很多人第一次写插入代码时跑完没有报错但SELECT一看数据没变就是因为忘了commit()。5.4 封装一个可复用的连接函数写多了之后你会发现每次连接都要重复写那一堆参数。一个很实用的做法是封装一个 get_conn 函数import pymysql def get_conn(): return pymysql.connect( host127.0.0.1, port3306, userroot, password你的root密码, databasetest_db, charsetutf8mb4, )后续每个脚本都from db_utils import get_conn然后拿到连接开始操作。这一步属于代码组织层面的常见实践虽然不是这篇的重点但建议从最开始就有这个意识后面写爬虫存数据、写量化回测存指标时能省下大量重复劳动。5.5 把配置单独拎出来的一个习惯连接参数如果直接写在代码里换台电脑、换个密码就要全局搜索修改非常不方便。我会建议这么干# config.py DB_CONFIG { host: 127.0.0.1, port: 3306, user: root, password: 你的root密码, database: test_db, charset: utf8mb4, }# db_utils.py import pymysql from config import DB_CONFIG def get_conn(): return pymysql.connect(**DB_CONFIG)这样做的直接好处是不同环境本地、服务器只需要改一个配置文件代码主体不用动。这也是后面做真实项目时非常标准的组织方式。6. 新人链接 MySQL 时的高频报错错误码、原因和逐个排查6.1 先从报错本身说起我发现新手排查问题的最大障碍不是报错多而是看到一长串英文就慌。其实 python 报错信息里最关键的部分往往在最后几行前面一大段是调用栈不用细看。链接 MySQL 的报错核心就那么几类。报错核心信息常见原因排查方向Access denied for user rootlocalhost密码错误或用户权限不足核对密码确认 root 密码Cant connect to MySQL server (10061/2003)服务未启动或端口不对检查 MySQL80 服务状态查 3306 端口Authentication plugin caching_sha2_password cannot be loadedpymysql 版本过旧或连接参数不支持新认证插件升级 pymysql或检查版本SSL connection error服务端 SSL 配置和客户端要求不一致补充 ssl 参数或检查安装时的 SSL 配置Unknown database xxx连接参数里 database 写错或者库没建执行 SHOW DATABASES 核对6.2 逐个排查的思路Access denied是最常见的一般就是密码问题。检查一下 MySQL 命令行能不能用你填的密码登录。如果命令行都进不去那别提 Python 了。另外还有一种情况是用户填了 rootlocalhost但连接时 host 填的是某个机器名导致匹配不上的情况本地连接统一回环地址即可。Cant connect首先确认服务是否在运行。Windows 服务管理器里看到 MySQL80 状态是停止就启动它。如果服务已经在跑但还是连不上用netstat -ano | findstr 3306确认端口监听是不是在 127.0.0.1有时候安装配置里绑定了特定 IP也会导致连接失败。caching_sha2_password cannot be loaded这类报错在 MySQL 8.0 刚出来那几年确实劝退了一大批人本质是 pymysql 旧版本不支持新版默认认证协议。解决办法很简单升级 pymysql 到最新版本。pip install --upgrade pymysql如果升级后还报这个错再检查安装的 MySQL 服务端变量确认默认认证插件是不是被手动改过。SSL 连接错误这个我要多说几句。一些 MySQL 新版本默认开启 SSL客户端却因为各种原因没有正确握手就会出现 SSL 错。pymysql 里可以通过如下参数显式处理conn pymysql.connect( host127.0.0.1, port3306, userroot, password你的root密码, databasetest_db, charsetutf8mb4, ssl{check_hostname: False, verify_mode: 0}, )注意本地学习场景里关闭 SSL 验证不会带来多少安全风险但如果是在公司生产环境请务必遵循团队规范不要随意关掉校验。6.3 一个实战排查流程示例假设运行下面这段代码时发现报错import pymysql conn pymysql.connect( host127.0.0.1, port3306, userroot, password123456, databasetest_db, charsetutf8mb4, )报错信息显示Cant connect to MySQL server on 127.0.0.1 (10061)我的排查顺序是先确认服务按 WinR 输入 services.msc找到 MySQL80看状态。发现是停止的启动服务net start mysql80运行代码此时又能报 Access denied——说明 10061 问题解决现在到了密码环节用 MySQL 命令行直接验一遍密码确实不对换成安装时设置的密码连接成功这个流程的核心逻辑是每个报错只解决一个具体问题从外到内一层层逼近真正的原因而不是堆叠一顿乱查。6.4 乱码问题的处理方式查询结果里的中文显示成???或者 Python 端输出乱码绝大多数是编码不一致导致。记住一个组合建库建表时库表字符集设置 utf8mb4pymysql 连接参数里 import 字段 charsetutf8mb4终端如果还是乱码Windows 控制台可以在 Python 里强制指定输出编码一个完整可用的连接参数写法conn pymysql.connect( host127.0.0.1, port3306, userroot, password你的root密码, databasetest_db, charsetutf8mb4, cursorclasspymysql.cursors.DictCursor, )这里加了一个DictCursor查询结果会变成字典而不是元组字段名和值对应起来对新手来说输出更直观。像这样的小改动使用起来体验差异很大。把 MySQL 连接这块跑通之后你会发现后面学什么都顺了很多。比如写爬虫时把抓到的数据 insert 进表逻辑就是这篇的插入代码加一个循环做 Flask Web 项目时用户登录校验就是查询代码加一个条件判断。我自己最开始最大的体会是很多东西不是不会而是被环境污染和工具选择耗掉了太多精力。所以这一篇记录里特意把开发工具、安装验证、连接报错这些杂事梳理成了固定流程下一次你换电脑重装环境照着走一遍就行不用再从头搜一遍“mysql 安装教程 8.0”和“vscode python 环境配置”。