首页/新闻资讯/正文详情

用 pymysql 连接数据库:从 connect 到 commit 的完整操作指南

发布时间:2026/9/28 21:54:42 来源:云帆数科 栏目:资讯中心
用 pymysql 连接数据库:从 connect 到 commit 的完整操作指南
1. 为什么你的 pymysql 一跑就报错先看清 connect 到 commit 的链路很多 Python 开发者第一次用 pymysql 连数据库代码看着没问题运行起来却报Access denied、Unknown database或者更隐蔽的——数据明明插进去了重新查询却什么都没有。问题往往不在 SQL 本身而在于没搞清楚 pymysql 的四个核心环节connect 建立连接、cursor 创建游标、execute 执行语句、commit 提交事务。pymysql 是纯 Python 实现的 MySQL 客户端库不需要编译 C 扩展pip install pymysql就能用。它适合谁适合做数据采集落库、后台脚本、Flask/Django 之外的轻量数据操作以及需要快速验证 SQL 逻辑的场景。你可以把它理解成一座桥Python 程序在桥这头MySQL 服务在桥那头connect 是搭桥cursor 是桥上的传送带execute 是把货物放上传送带commit 则是按下“确认收货”——不按货就一直在半路。我试过在本地起一个 MySQL 8.0用 pymysql 走一遍建表、插入、查询、更新、删除的完整闭环中间踩过字符集和事务的坑。下面把可复制的配置骨架和验证动作拆开讲你跟着敲一遍就能独立跑通。2. 前置准备装库、建库、确认连接四要素在写代码之前先把环境理清楚。pymysql 的安装很简单pip install pymysql如果你用的是虚拟环境先激活再装。装完可以用pip show pymysql确认版本一般 1.1.x 就够用。接着确认 MySQL 服务在跑并且你有一个可用的库。这里假设你已经建好一个名为ss的数据库。如果没有用命令行或客户端执行CREATE DATABASE ss DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;字符集建议统一用utf8mb4否则中文和 emoji 容易出问题。连接四要素必须写对host、user、password、database。密码字段在 pymysql 里既可以写password也可以写passwd两者等价但别拼错。端口默认 3306如果改过要显式指定port。注意连接信息不要硬编码在业务代码里正式项目建议走环境变量或配置文件。本文为了演示直观直接写在代码中。3. 可复制配置connect、cursor、execute、commit 四步骨架先给一个最小可运行骨架把四个环节串起来。这段代码的作用是连接数据库、查询 MySQL 版本验证链路是否通import pymysql # 第一步connect 建立连接 conn pymysql.connect( hostlocalhost, userroot, password123456, databasess, port3306, charsetutf8mb4 ) try: # 第二步cursor 创建游标 cursor conn.cursor() # 第三步execute 执行 SQL cursor.execute(SELECT VERSION()) # 取回单条结果 data cursor.fetchone() print(MySQL 版本:, data) finally: # 第四步关闭游标和连接 cursor.close() conn.close()运行后如果打印出类似MySQL 版本: (8.0.36,)说明 connect、cursor、execute 三个环节都通了。这里没有写 commit因为查询不改变数据状态不需要提交。接下来建一张表把 commit 加进来。表名和字段名建议用反引号包裹避免和关键字冲突import pymysql conn pymysql.connect( hostlocalhost, userroot, password123456, databasess, charsetutf8mb4 ) try: cursor conn.cursor() sql CREATE TABLE IF NOT EXISTS tast ( first_name VARCHAR(10) PRIMARY KEY, last_name VARCHAR(10), age INT(5), sex VARCHAR(6), income INT(30) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 cursor.execute(sql) # 关键DDL 之后也要 commit否则部分场景下不生效 conn.commit() print(建表成功) except Exception as e: conn.rollback() print(建表失败:, e) finally: cursor.close() conn.close()这里有个容易忽略的点CREATE TABLE属于 DDL在 MySQL 里默认是自动提交的但显式写conn.commit()更稳妥也养成习惯。异常捕获里加conn.rollback()出错时回滚避免留下半成品状态。4. 增删改查全流程executemany 批量插入与事务提交验证建好表后先插入数据。单条插入用execute多条插入用executemany后者效率更高import pymysql conn pymysql.connect( hostlocalhost, userroot, password123456, databasess, charsetutf8mb4 ) try: cursor conn.cursor() sql INSERT INTO tast (first_name, last_name, age, sex, income) VALUES (%s, %s, %s, %s, %s) params ( (a, joe, 21, m, 5000), (b, jae, 22, f, 5000), (c, jbe, 23, f, 5000), (d, jvce, 24, m, 5000), ) rows cursor.executemany(sql, params) conn.commit() print(影响行数:, rows) except Exception as e: conn.rollback() print(插入失败:, e) finally: cursor.close() conn.close()executemany返回的是受影响的行数这里应该是 4。注意参数用%s占位不要用字符串拼接否则会有 SQL 注入风险。插入完成后验证查询import pymysql conn pymysql.connect( hostlocalhost, userroot, password123456, databasess, charsetutf8mb4 ) try: cursor conn.cursor() cursor.execute(SELECT first_name, age, income FROM tast WHERE sex %s, (f,)) results cursor.fetchall() for row in results: print(row) finally: cursor.close() conn.close()fetchall()返回所有结果fetchone()返回单条。如果查询结果为空fetchone()返回None别直接下标取值。更新和删除同样遵循 execute commit 的模式# 更新 cursor.execute(UPDATE tast SET income %s WHERE first_name %s, (8000, a)) conn.commit() # 删除 cursor.execute(DELETE FROM tast WHERE first_name %s, (d,)) conn.commit()每次改动数据后都要 commit否则当前连接关闭时改动会丢失。你可以做个实验把 commit 注释掉插入数据后关闭连接再重新查询会发现数据没进去——这就是事务未提交的典型表现。5. 验证请求与成功结果用一条查询确认闭环完整的验证动作是这样插入数据后不关闭连接直接在同一连接内查询确认数据可见然后关闭连接重新建立连接再查一次确认数据已持久化。import pymysql def get_conn(): return pymysql.connect( hostlocalhost, userroot, password123456, databasess, charsetutf8mb4 ) # 第一次连接插入并查询 conn get_conn() cursor conn.cursor() cursor.execute(INSERT INTO tast VALUES (e, test, 30, m, 9000)) conn.commit() cursor.execute(SELECT COUNT(*) FROM tast) print(当前连接内行数:, cursor.fetchone()) cursor.close() conn.close() # 第二次连接重新查询验证持久化 conn2 get_conn() cursor2 conn2.cursor() cursor2.execute(SELECT COUNT(*) FROM tast) print(新连接行数:, cursor2.fetchone()) cursor2.close() conn2.close()两次打印的行数一致说明 commit 生效、数据已落盘。如果第二次查不到八成是 commit 漏了或者连接用了自动提交关闭的配置。6. 本篇常见错排查从报错信息定位到具体环节下面这张表把高频报错和对应环节列出来方便你对号入座报错信息可能原因排查动作Access denied for user用户名或密码错核对 connect 的 user/passwordUnknown database ss库不存在或名字拼错执行SHOW DATABASES确认Cant connect to MySQL server服务没起或 host/port 错检查 MySQL 进程和端口插入后查不到数据漏了 commit在 execute 后加 conn.commit()中文乱码字符集不统一connect 加 charsetutf8mb4建库建表也用 utf8mb4Commands out of sync上一个结果集没读完用 fetchall 读完或换新 cursor还有一个隐蔽的坑cursor和conn忘记关闭长时间运行会耗尽连接数。建议用try/finally或上下文管理器。pymysql 的连接对象支持with语法但游标需要手动管理写法如下with pymysql.connect(hostlocalhost, userroot, password123456, databasess, charsetutf8mb4) as conn: with conn.cursor() as cursor: cursor.execute(SELECT 1) print(cursor.fetchone())with块结束时会自动 commit如果没异常或 rollback如果有异常并关闭连接。这个写法能省掉不少样板代码。如果你在排查连接或权限问题时需要更细的日志可以在 connect 里加cursorclasspymysql.cursors.DictCursor让结果以字典返回字段名一目了然调试时更直观。7. 把连接配置沉淀成可复用模块跑通一次闭环后建议把连接逻辑抽成函数或类避免每次重复写四要素。一个简单的做法是用字典存配置从环境变量读取import os import pymysql def get_connection(): return pymysql.connect( hostos.getenv(DB_HOST, localhost), useros.getenv(DB_USER, root), passwordos.getenv(DB_PASSWORD, 123456), databaseos.getenv(DB_NAME, ss), charsetutf8mb4, cursorclasspymysql.cursors.DictCursor )这样本地开发和线上部署只需改环境变量代码不用动。配合with语法一个完整的读写操作可以压缩到几行with get_connection() as conn: with conn.cursor() as cursor: cursor.execute(SELECT * FROM tast WHERE age %s, (20,)) for row in cursor.fetchall(): print(row[first_name], row[income])到这里connect、cursor、execute、commit 四个环节你已经完整走了一遍。接下来可以试着把 SQL 换成自己的业务表或者接入定时任务做批量落库。如果后续要接大模型做数据问答、或者把数据库操作封装成 Agent 工具可以到 TaoToken 的模型对话页面先验证模型对 SQL 的理解能力再决定怎么把 pymysql 的读写链路嵌进你的编码工作流。

相关推荐

5招搞定怎么查看网站用的php还是.net避坑指南
5招搞定怎么查看网站用的php还是.net避坑指南

5招搞定怎么查看网站用的php还是.net避坑指南 改个需求建站公司拖一周,这种憋屈事你肯定碰过。明明只是换个文案、调个颜色,对方却以“技术架构复杂”、“需要重构”为由拖延工期,甚至暗示要加钱。这时候你心里肯定犯嘀咕:这网站到底是用… · 2026/9/27 16:10:58

私藏分享!四款小众但逆天的 Windows 工具,TaoToken 统一 Key 配置实测
私藏分享!四款小众但逆天的 Windows 工具,TaoToken 统一 Key 配置实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 16:10:58

wordpressviews插件保姆级教程
wordpressviews插件保姆级教程

WordPress Views插件安全完整流程实战 域名服务器搞不懂?别慌,先稳住心态。 很多新手做站,卡在配置上就乱了阵脚。 今天把WordPress Views插件安全完整流程拆解给你看。 威胁场景:插件被黑后的真实代价… · 2026/9/27 16:10:52

Spingboot启动预热的实现
Spingboot启动预热的实现

启动预热的适用场景启动预热适合以下情况:数据主要来自第三方接口,无法直接从本地数据库读取。第三方接口响应较慢,首次访问容易超时。一个页面需要调用多个第三方接口或逐项查询。数据读取频繁,但变化不频繁。希望服务启动后&… · 2026/9/29 6:52:37

Understanding Driving Risks using Large Language Models: Toward Elderly Driver Assessment
Understanding Driving Risks using Large Language Models: Toward Elderly Driver Assessment

文章主要内容总结 本文研究了多模态大语言模型(具体为ChatGPT-4o)利用静态行车记录仪图像进行类人交通场景解读的潜力,重点聚焦与老年司机评估相关的三项任务:交通密度评估、交叉口可见性评估和停车标志识别。这些任务需上下文推理而非简单目标检测。研究采用零样本、少样… · 2026/9/29 12:28:25

Leveraging Large Language Models for Classifying App Users‘ Feedback
Leveraging Large Language Models for Classifying App Users‘ Feedback

文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)解决应用用户反馈分类的挑战,传统方法依赖有监督机器学习,但受限于标注数据集的规模和质量。研究通过三个核心实验评估了4种先进LLMs(GPT-3.5-Turbo、GPT-4o、Flan-T5、Llama3-70b)的性能: LLMs在用户反馈分类中的基… · 2026/9/29 13:54:46

Using Large Language Models for Legal Decision-Making in Austrian Value-Added Tax Law: An Experim...
Using Large Language Models for Legal Decision-Making in Austrian Value-Added Tax Law: An Experim...

文章主要内容总结 本文通过实验评估了大型语言模型(LLMs)在奥地利及欧盟增值税(VAT)法框架下辅助法律决策的能力。研究聚焦于两种提升LLM性能的方法——微调(fine-tuning)和检索增强生成(RAG),并在两类案例中进行验证:一是权威教科书案例,二是税务咨询公司的真实案… · 2026/9/29 13:54:48

学Java别走弯路,这5个方向最吃香
学Java别走弯路,这5个方向最吃香

学Java的人很多,但学明白的人不多。有人学了半年还在写控制台程序,有人一年就能独当一面。差别不在天赋,而在方向。Java生态太庞大了,什么都学等于什么都没学。选对方向,事半功倍。今天盘点当前最吃香的5个Java方向&am… · 2026/9/29 4:13:53

AlphaAgents: Large Language Model based Multi-Agents for Equity Portfolio Constructions
AlphaAgents: Large Language Model based Multi-Agents for Equity Portfolio Constructions

AlphaAgents相关总结与翻译 一、文章主要内容总结 (一)研究背景与问题 传统股票投资组合管理依赖人类分析师处理海量信息(如财务披露、财报、市场新闻等),存在信息处理效率低、易受认知偏差(如损失厌恶、过度自信)影响的问题,可能错失投资收益机会。尽管AI在数据处理… · 2026/9/29 13:54:44

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/29 0:45:26

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/29 13:54:52

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/29 8:55:58

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码