news 2026/4/16 14:17:10

Python操作MySQL数据库:从入门到实战的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python操作MySQL数据库:从入门到实战的完整指南

文章目录

    • 一、准备工作:环境搭建与依赖安装
      • 1. 确认MySQL环境
      • 2. 安装pymysql库
    • 二、核心操作:连接MySQL数据库
      • 1. 基础连接语法
      • 2. 最简连接示例
      • 3. 进阶:使用with语句自动释放资源
    • 三、实战操作:数据库增删改查(CRUD)
      • 先准备测试表
      • 1. 数据查询(SELECT)
        • 示例1:查询单条数据(返回字典格式)
        • 示例2:查询多条数据
      • 2. 数据插入(INSERT)
      • 3. 数据更新(UPDATE)
      • 4. 数据删除(DELETE)
    • 四、高级技巧:事务与异常处理
      • 1. 事务处理
      • 2. 异常处理
    • 五、生产环境优化要点
      • 1. 防止SQL注入
      • 2. 使用连接池
      • 3. 字符编码优化
      • 4. 批量操作优化
    • 六、常见问题排查

MySQL作为全球最流行的开源关系型数据库之一,广泛应用于Web开发、数据分析、后台系统等场景。而Python凭借简洁的语法和丰富的库生态,成为操作MySQL的首选语言之一。本文将以实战为导向,详细讲解如何通过Python的pymysql库实现MySQL数据库的连接、增删改查(CRUD)、事务处理等核心操作,同时覆盖生产环境中的优化技巧和避坑要点,适合Python初学者和后端开发人员学习。

一、准备工作:环境搭建与依赖安装

1. 确认MySQL环境

首先确保本地或远程服务器已安装MySQL数据库,可通过以下命令验证(Windows需配置MySQL环境变量,Linux/macOS直接执行):

# 登录MySQL终端mysql -u root -p

输入密码后能正常进入MySQL交互界面,说明环境可用。若未安装MySQL,可参考官方文档(MySQL下载地址)完成安装。

2. 安装pymysql库

pymysql是纯Python实现的MySQL客户端库,兼容Python 3.x,无需编译,安装简单:

# 基础安装pipinstallpymysql# 安装指定稳定版本(推荐)pipinstallpymysql==1.1.0

安装完成后,在Python脚本中导入验证,无报错即安装成功:

importpymysql

二、核心操作:连接MySQL数据库

1. 基础连接语法

pymysql通过connect()方法创建数据库连接对象,核心参数如下(必选参数标注*):

参数名说明示例
host*MySQL服务器地址localhost/192.168.1.10
port端口号,默认33063306
user*数据库用户名root
password*数据库密码123456
database*要连接的数据库名test_db
charset字符编码,推荐utf8mb4utf8mb4
connect_timeout连接超时时间(秒)10

2. 最简连接示例

importpymysql# 1. 创建连接conn=pymysql.connect(host="localhost",port=3306,user="root",password="你的MySQL密码",database="test_db",charset="utf8mb4")# 2. 创建游标(执行SQL的核心对象)cursor=conn.cursor()# 3. 验证连接print("数据库连接成功!")# 4. 关闭资源(避免内存泄漏)cursor.close()conn.close()

3. 进阶:使用with语句自动释放资源

手动关闭游标和连接容易遗漏,推荐使用with语句,代码块结束后自动释放资源:

importpymysql# with语句管理连接和游标withpymysql.connect(host="localhost",port=3306,user="root",password="你的MySQL密码",database="test_db",charset="utf8mb4")asconn:withconn.cursor()ascursor:# 执行SQL操作(后续示例均基于此写法)print("连接已建立,游标创建完成")

三、实战操作:数据库增删改查(CRUD)

先准备测试表

为方便演示,先在MySQL中创建user表:

CREATETABLEIFNOTEXISTSuser(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(50)NOTNULL,ageINT,genderVARCHAR(10),create_timeDATETIMEDEFAULTCURRENT_TIMESTAMP)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

1. 数据查询(SELECT)

查询是最常用的操作,pymysql提供fetchone()(单条)、fetchall()(全部)、fetchmany(n)(指定条数)三种获取结果的方式。

示例1:查询单条数据(返回字典格式)
importpymysqldefquery_single_user(user_id):withpymysql.connect(host="localhost",port=3306,user="root",password="你的MySQL密码",database="test_db",charset="utf8mb4")asconn:# 指定游标返回字典(key为字段名),更易读withconn.cursor(cursor=pymysql.cursors.DictCursor)ascursor:# 参数化查询(%s为占位符),避免SQL注入sql="SELECT id, name, age, gender FROM user WHERE id = %s"cursor.execute(sql,(user_id,))# 获取单条结果result=cursor.fetchone()ifresult:print(f"查询结果:ID={result['id']},姓名={result['name']},年龄={result['age']}")else:print("无匹配数据")# 调用函数查询ID为1的用户query_single_user(1)
示例2:查询多条数据
importpymysqldefquery_multi_users(min_age):withpymysql.connect(host="localhost",port=3306,user="root",password="你的MySQL密码",database="test_db",charset="utf8mb4")asconn:withconn.cursor(cursor=pymysql.cursors.DictCursor)ascursor:# 查询年龄大于指定值的用户sql="SELECT id, name, age FROM user WHERE age > %s"cursor.execute(sql,(min_age,))# 获取所有结果results=cursor.fetchall()print(f"共查询到{cursor.rowcount}条数据:")forrowinresults:print(f"-{row['name']}{row['age']}岁)")# 调用函数查询年龄大于18的用户query_multi_users(18)

2. 数据插入(INSERT)

插入数据需注意提交事务conn.commit()),否则数据不会写入数据库;批量插入推荐使用executemany()提升效率。

importpymysqldefinsert_user():withpymysql.connect(host="localhost",port=3306,user="root",password="你的MySQL密码",database="test_db",charset="utf8mb4")asconn:withconn.cursor()ascursor:# 单条插入sql_single="INSERT INTO user (name, age, gender) VALUES (%s, %s, %s)"cursor.execute(sql_single,("张三",22,"男"))# 批量插入(效率更高)user_list=[("李四",20,"女"),("王五",25,"男"),("赵六",19,"女")]cursor.executemany(sql_single,user_list)# 提交事务(关键!否则数据不生效)conn.commit()print(f"插入成功,共新增{cursor.rowcount}条数据")# 调用函数插入数据insert_user()

3. 数据更新(UPDATE)

importpymysqldefupdate_user_age(user_name,new_age):withpymysql.connect(host="localhost",port=3306,user="root",password="你的MySQL密码",database="test_db",charset="utf8mb4")asconn:withconn.cursor()ascursor:# 更新指定用户的年龄sql="UPDATE user SET age = %s WHERE name = %s"cursor.execute(sql,(new_age,user_name))# 提交事务conn.commit()ifcursor.rowcount>0:print(f"更新成功,共修改{cursor.rowcount}条数据")else:print("无匹配用户,未修改任何数据")# 调用函数将“张三”的年龄改为23update_user_age("张三",23)

4. 数据删除(DELETE)

删除数据需谨慎,建议先通过查询验证条件,再执行删除操作。

importpymysqldefdelete_user(age_limit):withpymysql.connect(host="localhost",port=3306,user="root",password="你的MySQL密码",database="test_db",charset="utf8mb4")asconn:withconn.cursor()ascursor:# 删除年龄小于指定值的用户sql="DELETE FROM user WHERE age < %s"cursor.execute(sql,(age_limit,))# 提交事务conn.commit()print(f"删除成功,共删除{cursor.rowcount}条数据")# 调用函数删除年龄小于18的用户delete_user(18)

四、高级技巧:事务与异常处理

1. 事务处理

MySQL默认开启事务,当执行多个关联操作时(如转账:扣减A账户+增加B账户),需保证全部操作成功才提交,任一失败则回滚,避免数据不一致。

importpymysqldeftransfer_money(from_id,to_id,amount):conn=Nonecursor=Nonetry:conn=pymysql.connect(host="localhost",port=3306,user="root",password="你的MySQL密码",database="test_db",charset="utf8mb4")cursor=conn.cursor()# 步骤1:扣减转出账户金额sql1="UPDATE account SET balance = balance - %s WHERE id = %s"cursor.execute(sql1,(amount,from_id))# 步骤2:增加转入账户金额sql2="UPDATE account SET balance = balance + %s WHERE id = %s"cursor.execute(sql2,(amount,to_id))# 提交事务(全部操作成功)conn.commit()print("转账成功!")exceptpymysql.MySQLErrorase:# 回滚事务(任一操作失败)conn.rollback()print(f"转账失败,已回滚:{e}")finally:# 关闭资源ifcursor:cursor.close()ifconn:conn.close()# 调用函数:从ID=1的账户转账100元到ID=2的账户transfer_money(1,2,100)

2. 异常处理

常见异常包括连接失败、SQL语法错误、主键冲突等,需捕获pymysql.MySQLError并针对性处理:

importpymysqldefsafe_query():try:withpymysql.connect(host="localhost",port=3306,user="root",password="错误密码",# 故意设置错误密码database="test_db",charset="utf8mb4")asconn:withconn.cursor()ascursor:cursor.execute("SELECT * FROM user")exceptpymysql.OperationalErrorase:print(f"连接错误:{e}")# 如密码错误、服务器未启动exceptpymysql.ProgrammingErrorase:print(f"SQL语法错误:{e}")# 如表名写错、字段不存在exceptpymysql.IntegrityErrorase:print(f"数据完整性错误:{e}")# 如主键重复、外键约束exceptpymysql.MySQLErrorase:print(f"MySQL通用错误:{e}")

五、生产环境优化要点

1. 防止SQL注入

绝对禁止直接拼接SQL字符串,必须使用参数化查询(%s占位符)。以下是危险示例(禁止使用)和正确示例对比:

# 危险!易被SQL注入(如name值为 "张三' OR 1=1 --")name="张三"sql=f"SELECT * FROM user WHERE name = '{name}'"# 禁止!# 正确:参数化查询sql="SELECT * FROM user WHERE name = %s"cursor.execute(sql,(name,))# 安全

2. 使用连接池

频繁创建/关闭连接会消耗大量资源,生产环境推荐使用pymysqlpool(连接池库):

# 安装连接池库pipinstallpymysqlpool
frompymysqlpoolimportConnectionPool# 配置连接池pool=ConnectionPool(host="localhost",port=3306,user="root",password="你的MySQL密码",database="test_db",charset="utf8mb4",max_size=10,# 最大连接数min_size=2# 最小空闲连接数)# 获取连接并执行操作defquery_with_pool():conn=pool.get_connection()withconn.cursor(cursor=pymysql.cursors.DictCursor)ascursor:cursor.execute("SELECT * FROM user LIMIT 5")print(cursor.fetchall())# 归还连接到池(无需关闭)conn.close()query_with_pool()

3. 字符编码优化

连接时指定charset="utf8mb4"(而非utf8),utf8mb4兼容所有Unicode字符(包括emoji),避免插入特殊字符时出现编码错误。

4. 批量操作优化

插入/更新大量数据时,优先使用executemany()而非循环execute(),减少网络交互次数;同时可关闭自动提交(conn.autocommit(False)),批量操作后一次性提交。

六、常见问题排查

  1. Access denied for user:检查用户名/密码是否正确,或MySQL用户是否允许当前IP访问(执行GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '密码'; FLUSH PRIVILEGES;开放远程访问)。
  2. TimeoutError:确认MySQL服务器已启动,防火墙/安全组开放3306端口,或增加connect_timeout参数。
  3. 数据插入后查询不到:未执行conn.commit()提交事务,或连接的数据库名称错误。
  4. 中文乱码:连接时未指定charset="utf8mb4",或表的字符集不是utf8mb4
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:36:56

原神智能助手完全攻略:解放双手的自动化游戏体验

原神智能助手完全攻略&#xff1a;解放双手的自动化游戏体验 【免费下载链接】better-genshin-impact &#x1f368;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动派遣 | 一键强化 - UI Automation Testing Tools For Gens…

作者头像 李华
网站建设 2026/4/10 22:09:25

STM32空气检测系统项目中解决的问题

1.项目的开始做这个项目的初衷&#xff0c;首先自己是小白&#xff0c;需要项目经验&#xff0c;同时老师布置了一个大作业&#xff0c;然后我的想法是这个大作业的作品是检测甲醛气体之类的。但我上网搜索之后发现一个辰哥单片机的博主&#xff0c;他做的那个空气质量检测项目…

作者头像 李华
网站建设 2026/4/8 17:16:31

5分钟搞定网易云音乐NCM转MP3:零基础也能轻松上手

5分钟搞定网易云音乐NCM转MP3&#xff1a;零基础也能轻松上手 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器上播放而烦恼吗&#xff1f;作为音乐爱好者&#xff0c;我们都希望自…

作者头像 李华
网站建设 2026/4/16 13:55:39

3大核心优势:XUnity Auto Translator新手实战教程

3大核心优势&#xff1a;XUnity Auto Translator新手实战教程 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator Unity游戏玩家经常会遇到语言障碍的困扰&#xff0c;特别是那些只有日文或韩文版本的游戏。X…

作者头像 李华
网站建设 2026/4/8 21:04:07

最新 CTF 入门实战指南:从认知到参赛的全流程解析

最新 CTF 入门实战指南&#xff1a;从认知到参赛的全流程解析 “CTF 是什么&#xff1f;没基础能玩吗&#xff1f;打比赛对找工作有用吗&#xff1f;”—— 这是几乎所有安全新手的灵魂三问。实际上&#xff0c;CTF&#xff08;夺旗赛&#xff09;是网络安全的实战练兵场&#…

作者头像 李华
网站建设 2026/4/16 13:54:31

“域名托管”和“SSL 证书缺失”是什么关系?

“您的连接不是私密连接” Q&#xff1a;这是什么意思&#xff1f;您的连接不是私密连接 net::ERR_CERT_AUTHORITY_INVALIDA&#xff1a; 当前网站的 HTTPS / SSL 证书存在问题&#xff0c;浏览器无法信任该站点。 在巡检网站的过程中&#xff0c;这类错误和“域名托管页面”一…

作者头像 李华