网站建设怎么插图片,wap网站一键生成app,网站导航结构设计,木藕设计网文章目录一、准备工作#xff1a;环境搭建与依赖安装1. 确认MySQL环境2. 安装pymysql库二、核心操作#xff1a;连接MySQL数据库1. 基础连接语法2. 最简连接示例3. 进阶#xff1a;使用with语句自动释放资源三、实战操作#xff1a;数据库增删改查#xff08;CRUD#xf…文章目录一、准备工作环境搭建与依赖安装1. 确认MySQL环境2. 安装pymysql库二、核心操作连接MySQL数据库1. 基础连接语法2. 最简连接示例3. 进阶使用with语句自动释放资源三、实战操作数据库增删改查CRUD先准备测试表1. 数据查询SELECT示例1查询单条数据返回字典格式示例2查询多条数据2. 数据插入INSERT3. 数据更新UPDATE4. 数据删除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# 安装指定稳定版本推荐pipinstallpymysql1.1.0安装完成后在Python脚本中导入验证无报错即安装成功importpymysql二、核心操作连接MySQL数据库1. 基础连接语法pymysql通过connect()方法创建数据库连接对象核心参数如下必选参数标注*参数名说明示例host*MySQL服务器地址localhost/192.168.1.10port端口号默认33063306user*数据库用户名rootpassword*数据库密码123456database*要连接的数据库名test_dbcharset字符编码推荐utf8mb4utf8mb4connect_timeout连接超时时间秒102. 最简连接示例importpymysql# 1. 创建连接connpymysql.connect(hostlocalhost,port3306,userroot,password你的MySQL密码,databasetest_db,charsetutf8mb4)# 2. 创建游标执行SQL的核心对象cursorconn.cursor()# 3. 验证连接print(数据库连接成功)# 4. 关闭资源避免内存泄漏cursor.close()conn.close()3. 进阶使用with语句自动释放资源手动关闭游标和连接容易遗漏推荐使用with语句代码块结束后自动释放资源importpymysql# with语句管理连接和游标withpymysql.connect(hostlocalhost,port3306,userroot,password你的MySQL密码,databasetest_db,charsetutf8mb4)asconn:withconn.cursor()ascursor:# 执行SQL操作后续示例均基于此写法print(连接已建立游标创建完成)三、实战操作数据库增删改查CRUD先准备测试表为方便演示先在MySQL中创建user表CREATETABLEIFNOTEXISTSuser(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(50)NOTNULL,ageINT,genderVARCHAR(10),create_timeDATETIMEDEFAULTCURRENT_TIMESTAMP)ENGINEInnoDBDEFAULTCHARSETutf8mb4;1. 数据查询SELECT查询是最常用的操作pymysql提供fetchone()单条、fetchall()全部、fetchmany(n)指定条数三种获取结果的方式。示例1查询单条数据返回字典格式importpymysqldefquery_single_user(user_id):withpymysql.connect(hostlocalhost,port3306,userroot,password你的MySQL密码,databasetest_db,charsetutf8mb4)asconn:# 指定游标返回字典key为字段名更易读withconn.cursor(cursorpymysql.cursors.DictCursor)ascursor:# 参数化查询%s为占位符避免SQL注入sqlSELECT id, name, age, gender FROM user WHERE id %scursor.execute(sql,(user_id,))# 获取单条结果resultcursor.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(hostlocalhost,port3306,userroot,password你的MySQL密码,databasetest_db,charsetutf8mb4)asconn:withconn.cursor(cursorpymysql.cursors.DictCursor)ascursor:# 查询年龄大于指定值的用户sqlSELECT id, name, age FROM user WHERE age %scursor.execute(sql,(min_age,))# 获取所有结果resultscursor.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(hostlocalhost,port3306,userroot,password你的MySQL密码,databasetest_db,charsetutf8mb4)asconn:withconn.cursor()ascursor:# 单条插入sql_singleINSERT 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. 数据更新UPDATEimportpymysqldefupdate_user_age(user_name,new_age):withpymysql.connect(hostlocalhost,port3306,userroot,password你的MySQL密码,databasetest_db,charsetutf8mb4)asconn:withconn.cursor()ascursor:# 更新指定用户的年龄sqlUPDATE user SET age %s WHERE name %scursor.execute(sql,(new_age,user_name))# 提交事务conn.commit()ifcursor.rowcount0:print(f更新成功共修改{cursor.rowcount}条数据)else:print(无匹配用户未修改任何数据)# 调用函数将“张三”的年龄改为23update_user_age(张三,23)4. 数据删除DELETE删除数据需谨慎建议先通过查询验证条件再执行删除操作。importpymysqldefdelete_user(age_limit):withpymysql.connect(hostlocalhost,port3306,userroot,password你的MySQL密码,databasetest_db,charsetutf8mb4)asconn:withconn.cursor()ascursor:# 删除年龄小于指定值的用户sqlDELETE FROM user WHERE age %scursor.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):connNonecursorNonetry:connpymysql.connect(hostlocalhost,port3306,userroot,password你的MySQL密码,databasetest_db,charsetutf8mb4)cursorconn.cursor()# 步骤1扣减转出账户金额sql1UPDATE account SET balance balance - %s WHERE id %scursor.execute(sql1,(amount,from_id))# 步骤2增加转入账户金额sql2UPDATE account SET balance balance %s WHERE id %scursor.execute(sql2,(amount,to_id))# 提交事务全部操作成功conn.commit()print(转账成功)exceptpymysql.MySQLErrorase:# 回滚事务任一操作失败conn.rollback()print(f转账失败已回滚{e})finally:# 关闭资源ifcursor:cursor.close()ifconn:conn.close()# 调用函数从ID1的账户转账100元到ID2的账户transfer_money(1,2,100)2. 异常处理常见异常包括连接失败、SQL语法错误、主键冲突等需捕获pymysql.MySQLError并针对性处理importpymysqldefsafe_query():try:withpymysql.connect(hostlocalhost,port3306,userroot,password错误密码,# 故意设置错误密码databasetest_db,charsetutf8mb4)asconn:withconn.cursor()ascursor:cursor.execute(SELECT * FROM user)exceptpymysql.OperationalErrorase:print(f连接错误{e})# 如密码错误、服务器未启动exceptpymysql.ProgrammingErrorase:print(fSQL语法错误{e})# 如表名写错、字段不存在exceptpymysql.IntegrityErrorase:print(f数据完整性错误{e})# 如主键重复、外键约束exceptpymysql.MySQLErrorase:print(fMySQL通用错误{e})五、生产环境优化要点1. 防止SQL注入绝对禁止直接拼接SQL字符串必须使用参数化查询%s占位符。以下是危险示例禁止使用和正确示例对比# 危险易被SQL注入如name值为 张三 OR 11 --name张三sqlfSELECT * FROM user WHERE name {name}# 禁止# 正确参数化查询sqlSELECT * FROM user WHERE name %scursor.execute(sql,(name,))# 安全2. 使用连接池频繁创建/关闭连接会消耗大量资源生产环境推荐使用pymysqlpool连接池库# 安装连接池库pipinstallpymysqlpoolfrompymysqlpoolimportConnectionPool# 配置连接池poolConnectionPool(hostlocalhost,port3306,userroot,password你的MySQL密码,databasetest_db,charsetutf8mb4,max_size10,# 最大连接数min_size2# 最小空闲连接数)# 获取连接并执行操作defquery_with_pool():connpool.get_connection()withconn.cursor(cursorpymysql.cursors.DictCursor)ascursor:cursor.execute(SELECT * FROM user LIMIT 5)print(cursor.fetchall())# 归还连接到池无需关闭conn.close()query_with_pool()3. 字符编码优化连接时指定charsetutf8mb4而非utf8utf8mb4兼容所有Unicode字符包括emoji避免插入特殊字符时出现编码错误。4. 批量操作优化插入/更新大量数据时优先使用executemany()而非循环execute()减少网络交互次数同时可关闭自动提交conn.autocommit(False)批量操作后一次性提交。六、常见问题排查Access denied for user检查用户名/密码是否正确或MySQL用户是否允许当前IP访问执行GRANT ALL ON *.* TO root% IDENTIFIED BY 密码; FLUSH PRIVILEGES;开放远程访问。TimeoutError确认MySQL服务器已启动防火墙/安全组开放3306端口或增加connect_timeout参数。数据插入后查询不到未执行conn.commit()提交事务或连接的数据库名称错误。中文乱码连接时未指定charsetutf8mb4或表的字符集不是utf8mb4。