如何建立内部网站,微信公众号推广的方法,龙岩市住房和城乡建设局网站,个人网站制作的主要内容Python MySQL从零上手#xff1a;30分钟搞定pymysql基本CRUD操作 文章目录Python MySQL从零上手#xff1a;30分钟搞定pymysql基本CRUD操作一、环境准备#xff1a;搭建你的第一个PythonMySQL开发环境1.1 为什么需要pymysql#xff1f;1.2 一步步搭建环境二、核心概念…Python MySQL从零上手30分钟搞定pymysql基本CRUD操作文章目录Python MySQL从零上手30分钟搞定pymysql基本CRUD操作一、环境准备搭建你的第一个PythonMySQL开发环境1.1 为什么需要pymysql1.2 一步步搭建环境二、核心概念理解数据库连接的本质2.1 连接对象 vs 游标对象2.2 为什么需要字符集设置三、实战演练完整的CRUD操作3.1 创建数据库表3.2 插入数据Create3.3 查询数据Read3.4 更新数据Update3.5 删除数据Delete四、高级技巧事务处理和错误处理4.1 为什么需要事务4.2 完整的错误处理模板五、实际项目应用用户注册登录系统六、学习总结与避坑指南6.1 关键要点回顾6.2 常见问题与解决方案6.3 下一步学习方向学习交流与进阶刚开始用Python操作MySQL时我也被各种问题搞得焦头烂额——连接突然断开、SQL注入漏洞、查询结果乱码、事务不知道怎么用。但说实话一旦掌握了pymysql这个基础工具的正确用法你会发现数据库操作其实很简单。今天我就带你从零开始用30分钟搞定MySQL的基本增删改查CRUD让你在Python项目中能自信地操作数据库。一、环境准备搭建你的第一个PythonMySQL开发环境1.1 为什么需要pymysql你可能会有疑问Python不是自带数据库模块吗为什么还要装pymysql这里有个关键点要理解Python本身不直接支持MySQL它需要通过一个翻译官驱动来和MySQL对话。pymysql就是这样一个纯Python写的翻译官它把Python的指令翻译成MySQL能听懂的语言。我刚开始学的时候也试过MySQLdb但它在Python3上安装各种报错。后来发现pymysql完美支持Python3安装简单文档清晰就成了我的首选。1.2 一步步搭建环境第一步安装MySQL如果你还没安装MySQL我推荐用Docker一键搞定# 拉取MySQL镜像dockerpullmysql:8.0# 运行MySQL容器dockerrun-d\--namemysql_dev\-p3306:3306\-eMYSQL_ROOT_PASSWORDyourpassword\-eMYSQL_DATABASEtest_db\mysql:8.0第二步安装pymysqlpipinstallpymysql第三步验证安装创建一个简单的测试脚本test_connection.pyimportpymysqltry:# 尝试连接数据库connectionpymysql.connect(hostlocalhost,port3306,userroot,passwordyourpassword,databasetest_db,charsetutf8mb4)print(✅ 连接成功)connection.close()exceptExceptionase:print(f❌ 连接失败{e})运行这个脚本如果看到✅ 连接成功恭喜你环境搭建完成二、核心概念理解数据库连接的本质2.1 连接对象 vs 游标对象这是初学者最容易混淆的两个概念。让我用个比喻帮你理解连接对象就像你去图书馆办了一张借书卡游标对象就像你拿着这张卡在图书馆里找书、借书、还书一个连接可以有多个游标就像你可以同时借多本书一样。importpymysql# 1. 建立连接办借书卡connectionpymysql.connect(hostlocalhost,userroot,passwordyourpassword,databasetest_db,charsetutf8mb4)# 2. 创建游标开始找书cursorconnection.cursor()# 3. 执行SQL借书操作cursor.execute(SELECT * FROM users)# 4. 获取结果拿到书resultscursor.fetchall()# 5. 关闭游标和连接还书、退卡cursor.close()connection.close()2.2 为什么需要字符集设置我踩过的一个大坑中文数据存到数据库变成乱码。原因就是字符集没设置对。MySQL默认的latin1字符集不支持中文我们需要显式指定utf8mb4utf8mb4真正的UTF-8支持所有Unicode字符包括emojiutf8MySQL的伪UTF-8只支持基本多文种平面# 正确的连接方式connectionpymysql.connect(charsetutf8mb4,# 必须设置cursorclasspymysql.cursors.DictCursor# 让结果以字典形式返回)三、实战演练完整的CRUD操作让我们创建一个真实的用户管理系统包含创建表、增删改查所有操作。3.1 创建数据库表首先我们创建一个用户表。在实际项目中我建议先用SQL工具如MySQL Workbench设计好表结构。importpymysqldefcreate_users_table():创建用户表connectionpymysql.connect(hostlocalhost,userroot,passwordyourpassword,databasetest_db,charsetutf8mb4,cursorclasspymysql.cursors.DictCursor)try:withconnection.cursor()ascursor:# 创建用户表sqlCREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL UNIQUE,password_hash VARCHAR(255) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,is_active BOOLEAN DEFAULT TRUE)cursor.execute(sql)print(✅ 用户表创建成功)# 提交事务connection.commit()exceptExceptionase:print(f❌ 创建表失败{e})connection.rollback()# 回滚事务finally:connection.close()# 执行创建表create_users_table()3.2 插入数据Create插入数据时一定要使用参数化查询这是防止SQL注入的关键defadd_user(username,email,password):添加新用户connectionpymysql.connect(hostlocalhost,userroot,passwordyourpassword,databasetest_db,charsetutf8mb4,cursorclasspymysql.cursors.DictCursor)try:withconnection.cursor()ascursor:# 使用参数化查询防止SQL注入sqlINSERT INTO users (username, email, password_hash)VALUES (%s,%s,%s)# 注意这里使用元组传递参数cursor.execute(sql,(username,email,password))connection.commit()print(f✅ 用户{username}添加成功ID:{cursor.lastrowid})returncursor.lastrowid# 返回自增IDexceptpymysql.err.IntegrityErrorase:print(f❌ 添加失败用户名或邮箱已存在)returnNoneexceptExceptionase:print(f❌ 添加失败{e})connection.rollback()returnNonefinally:connection.close()# 测试添加用户add_user(张三,zhangsanexample.com,hashed_password_123)add_user(李四,lisiexample.com,hashed_password_456)3.3 查询数据Read查询是数据库最常用的操作。pymysql提供了几种获取结果的方式defquery_users():查询用户数据connectionpymysql.connect(hostlocalhost,userroot,passwordyourpassword,databasetest_db,charsetutf8mb4,cursorclasspymysql.cursors.DictCursor)try:withconnection.cursor()ascursor:# 1. 查询所有用户cursor.execute(SELECT * FROM users)# 获取结果的几种方式print(\n 所有用户 )all_userscursor.fetchall()# 获取所有记录foruserinall_users:print(fID:{user[id]}, 用户名:{user[username]}, 邮箱:{user[email]})# 2. 查询单个用户带条件cursor.execute(SELECT * FROM users WHERE username %s,(张三,))single_usercursor.fetchone()# 获取单条记录ifsingle_user:print(f\n 单个用户查询 )print(f找到用户:{single_user[username]})# 3. 分页查询实际项目常用page1page_size10offset(page-1)*page_sizecursor.execute(SELECT * FROM usersWHERE is_active TRUEORDER BY created_at DESCLIMIT%sOFFSET%s,(page_size,offset))page_userscursor.fetchall()print(f\n 第{page}页用户每页{page_size}条)foruserinpage_users:print(f用户名:{user[username]})exceptExceptionase:print(f❌ 查询失败{e})finally:connection.close()# 执行查询query_users()3.4 更新数据Update更新操作需要特别注意事务处理确保数据一致性。defupdate_user_email(user_id,new_email):更新用户邮箱connectionpymysql.connect(hostlocalhost,userroot,passwordyourpassword,databasetest_db,charsetutf8mb4,cursorclasspymysql.cursors.DictCursor)try:withconnection.cursor()ascursor:# 先检查用户是否存在cursor.execute(SELECT id FROM users WHERE id %s,(user_id,))ifnotcursor.fetchone():print(f❌ 用户ID{user_id}不存在)returnFalse# 更新邮箱sqlUPDATE users SET email %sWHERE id %saffected_rowscursor.execute(sql,(new_email,user_id))connection.commit()ifaffected_rows0:print(f✅ 用户{user_id}邮箱更新成功)returnTrueelse:print(f⚠️ 用户{user_id}邮箱未变化)returnFalseexceptpymysql.err.IntegrityError:print(f❌ 邮箱{new_email}已被其他用户使用)connection.rollback()returnFalseexceptExceptionase:print(f❌ 更新失败{e})connection.rollback()returnFalsefinally:connection.close()# 测试更新update_user_email(1,zhangsan_newexample.com)3.5 删除数据Delete删除操作要特别小心在实际项目中我们通常使用软删除标记删除而不是物理删除。defdelete_user(user_id,soft_deleteTrue):删除用户支持软删除connectionpymysql.connect(hostlocalhost,userroot,passwordyourpassword,databasetest_db,charsetutf8mb4,cursorclasspymysql.cursors.DictCursor)try:withconnection.cursor()ascursor:ifsoft_delete:# 软删除只是标记为不活跃sqlUPDATE users SET is_active FALSE WHERE id %soperation禁用else:# 物理删除真正从数据库删除慎用sqlDELETE FROM users WHERE id %soperation删除affected_rowscursor.execute(sql,(user_id,))connection.commit()ifaffected_rows0:print(f✅ 用户{user_id}{operation}成功)returnTrueelse:print(f❌ 用户{user_id}不存在)returnFalseexceptExceptionase:print(f❌{operation}失败{e})connection.rollback()returnFalsefinally:connection.close()# 测试删除使用软删除delete_user(2,soft_deleteTrue)方法返回结果适用场景内存占用fetchone()单条记录知道只有一条结果时低fetchall()所有记录列表结果集较小时高全部加载fetchmany(size)指定数量的记录分页或分批处理可控rowcount受影响的行数INSERT/UPDATE/DELETE后-四、高级技巧事务处理和错误处理4.1 为什么需要事务想象一下银行转账从A账户扣款向B账户加款。如果扣款成功但加款失败钱就消失了事务就是确保这两个操作要么都成功要么都失败。deftransfer_money(from_user_id,to_user_id,amount):转账操作演示事务connectionpymysql.connect(hostlocalhost,userroot,passwordyourpassword,databasetest_db,charsetutf8mb4,cursorclasspymysql.cursors.DictCursor)try:withconnection.cursor()ascursor:# 开始事务connection.begin()# 1. 检查转出账户余额假设有balance字段cursor.execute(SELECT balance FROM accounts WHERE user_id %s,(from_user_id,))from_balancecursor.fetchone()[balance]iffrom_balanceamount:raiseValueError(余额不足)# 2. 扣款cursor.execute(UPDATE accounts SET balance balance -%sWHERE user_id %s,(amount,from_user_id))# 3. 加款cursor.execute(UPDATE accounts SET balance balance %sWHERE user_id %s,(amount,to_user_id))# 4. 记录交易日志cursor.execute(INSERT INTO transactions (from_user_id, to_user_id, amount, type)VALUES (%s,%s,%s, transfer),(from_user_id,to_user_id,amount))# 提交事务所有操作都成功才执行connection.commit()print(f✅ 转账成功{from_user_id}-{to_user_id}金额{amount})returnTrueexceptExceptionase:# 任何一步出错回滚所有操作connection.rollback()print(f❌ 转账失败已回滚{e})returnFalsefinally:connection.close()4.2 完整的错误处理模板这是我多年总结的错误处理最佳实践defsafe_database_operation():安全的数据库操作模板connectionNonetry:connectionpymysql.connect(hostlocalhost,userroot,passwordyourpassword,databasetest_db,charsetutf8mb4,cursorclasspymysql.cursors.DictCursor,autocommitFalse# 手动控制事务)withconnection.cursor()ascursor:# 你的数据库操作代码cursor.execute(SELECT * FROM users)resultscursor.fetchall()connection.commit()returnresultsexceptpymysql.err.OperationalErrorase:# 连接错误网络问题、数据库宕机等print(f数据库连接错误{e})ifconnection:connection.rollback()returnNoneexceptpymysql.err.IntegrityErrorase:# 完整性错误唯一约束冲突、外键约束等print(f数据完整性错误{e})ifconnection:connection.rollback()returnNoneexceptpymysql.err.DataErrorase:# 数据错误数据类型不匹配、数据过长等print(f数据错误{e})ifconnection:connection.rollback()returnNoneexceptExceptionase:# 其他未知错误print(f未知错误{e})ifconnection:connection.rollback()returnNonefinally:# 确保连接被关闭ifconnection:connection.close()五、实际项目应用用户注册登录系统让我们把这些知识整合到一个实际项目中classUserManager:用户管理类封装数据库操作def__init__(self):self.connection_params{host:localhost,user:root,password:yourpassword,database:test_db,charset:utf8mb4,cursorclass:pymysql.cursors.DictCursor,autocommit:False}defregister_user(self,username,email,password):用户注册connectionpymysql.connect(**self.connection_params)try:withconnection.cursor()ascursor:# 检查用户名是否已存在cursor.execute(SELECT id FROM users WHERE username %s,(username,))ifcursor.fetchone():return{success:False,message:用户名已存在}# 检查邮箱是否已存在cursor.execute(SELECT id FROM users WHERE email %s,(email,))ifcursor.fetchone():return{success:False,message:邮箱已注册}# 插入新用户实际项目中密码应该加密sqlINSERT INTO users (username, email, password_hash)VALUES (%s,%s,%s)cursor.execute(sql,(username,email,password))user_idcursor.lastrowid# 创建用户配置记录cursor.execute(INSERT INTO user_settings (user_id) VALUES (%s),(user_id,))connection.commit()return{success:True,message:注册成功,user_id:user_id}exceptExceptionase:connection.rollback()return{success:False,message:f注册失败{str(e)}}finally:connection.close()deflogin(self,username,password):用户登录connectionpymysql.connect(**self.connection_params)try:withconnection.cursor()ascursor:# 查询用户信息sqlSELECT id, username, email, password_hash, is_activeFROM usersWHERE username %scursor.execute(sql,(username,))usercursor.fetchone()ifnotuser:return{success:False,message:用户不存在}ifnotuser[is_active]:return{success:False,message:账户已被禁用}# 验证密码实际项目中应该使用加密验证ifuser[password_hash]!password:return{success:False,message:密码错误}# 更新最后登录时间cursor.execute(UPDATE users SET last_login NOW() WHERE id %s,(user[id],))connection.commit()return{success:True,message:登录成功,user:{id:user[id],username:user[username],email:user[email]}}exceptExceptionase:connection.rollback()return{success:False,message:f登录失败{str(e)}}finally:connection.close()# 使用示例if__name____main__:managerUserManager()# 注册新用户resultmanager.register_user(王五,wangwuexample.com,password123)print(result)# 用户登录resultmanager.login(王五,password123)print(result)六、学习总结与避坑指南6.1 关键要点回顾连接管理每次操作后记得关闭连接避免连接泄漏参数化查询永远不要拼接SQL字符串防止SQL注入事务处理相关操作要放在同一个事务中错误处理针对不同类型的数据库错误进行适当处理字符集设置始终使用utf8mb4支持中文和特殊字符6.2 常见问题与解决方案问题可能原因解决方案pymysql.err.OperationalError: (2003)MySQL服务未启动启动MySQL服务sudo service mysql startpymysql.err.OperationalError: (1045)用户名或密码错误检查连接参数确认MySQL用户权限中文数据乱码字符集设置错误连接时设置charsetutf8mb4连接超时网络问题或连接未关闭使用连接池确保每次操作后关闭连接Lost connection to MySQL server长时间空闲连接被服务器关闭增加connect_timeout参数或使用连接池6.3 下一步学习方向掌握了pymysql的基本操作后你可以继续学习连接池技术使用DBUtils管理数据库连接提高并发性能ORM框架学习SQLAlchemy用面向对象的方式操作数据库异步操作使用aiomysql进行异步数据库操作数据库设计学习规范化、索引优化、查询优化学习交流与进阶恭喜你完成了Python MySQL的基本操作学习这只是开始后面还有连接池、ORM等更高效的方式等着你。欢迎在评论区分享你在连接MySQL时遇到了哪些报错文中的示例代码运行成功了吗对于事务管理你还有什么疑问我会为初学者提供针对性的解答。记得多敲代码这是学数据库最好的方式推荐学习资源pymysql官方文档 - 最权威的学习资料GitHub上的Python MySQL示例 - 实战代码参考MySQL官方教程 - 数据库系统学习下篇预告下一篇将分享《Python MySQL事务实战》从转账异常到数据一致性手把手教你避坑。学习建议编程学习就像练功不动手永远停留在理论阶段。立刻打开终端试试吧遇到问题不要怕每个错误都是进步的机会。我在学习pymysql时光是一个字符集问题就调试了一下午但解决后的成就感是无价的。