关联标准MySQLpymysql是 Python 中用于操作 MySQL 数据库的第三方库它实现了 Python DB API 2.0 规范纯 Python 编写无需依赖 C 扩展是新手和中小型项目操作 MySQL 的首选工具。下面从安装、核心用法、进阶技巧、最佳实践四个维度详解pymysql安装 pymysql首先需要通过 pip 安装pip install pymysql前置条件已安装 MySQL 服务本地 / 远程并知道数据库地址、端口、用户名、密码Python 版本建议 3.6pymysql 对低版本 Python 兼容性较差核心用法基础操作建立数据库连接第一步是创建数据库连接对象核心参数如下参数说明默认值hostMySQL 服务器地址localhostport端口号3306user用户名-password密码-database要连接的数据库名-charset字符编码建议 utf8mb4utf8autocommit是否自动提交事务False示例代码import pymysql # 1. 建立连接 try: conn pymysql.connect( hostlocalhost, port3306, userroot, password你的MySQL密码, databasetest_db, # 提前创建好的数据库 charsetutf8mb4 ) print(数据库连接成功) except pymysql.Error as e: print(f连接失败{e})创建游标执行 SQL 的核心对象游标Cursor是执行 SQL 语句、获取结果的载体常用两种游标普通游标返回结果为元组默认类型字典游标返回结果为字典更易读推荐新手使用# 2. 创建游标字典游标 cursor conn.cursor(cursorpymysql.cursors.DictCursor)执行 SQL 语句增删改查查询数据SELECT# 3.1 简单查询 try: # 执行SQL sql SELECT id, name, age FROM user WHERE age %s cursor.execute(sql, (18,)) # 使用%s占位符避免SQL注入参数用元组传递 # 获取结果的三种方式 # 方式1获取单条结果 # single_result cursor.fetchone() # print(单条结果, single_result) # 方式2获取指定条数 # multi_result cursor.fetchmany(2) # print(前2条结果, multi_result) # 方式3获取所有结果 all_results cursor.fetchall() print(所有结果) for row in all_results: print(fID: {row[id]}, 姓名: {row[name]}, 年龄: {row[age]}) except pymysql.Error as e: print(f查询失败{e})插入 / 更新 / 删除数据需要提交事务pymysql默认关闭自动提交增删改操作后必须手动commit()否则数据不会写入数据库出错时需rollback()回滚# 3.2 插入数据 try: # 单条插入 insert_sql INSERT INTO user (name, age) VALUES (%s, %s) cursor.execute(insert_sql, (张三, 20)) # 批量插入效率更高 # data_list [(李四, 22), (王五, 19)] # cursor.executemany(insert_sql, data_list) # 提交事务 conn.commit() print(f插入成功影响行数{cursor.rowcount}) except pymysql.Error as e: # 回滚事务 conn.rollback() print(f插入失败{e}) # 3.3 更新数据 try: update_sql UPDATE user SET age %s WHERE name %s cursor.execute(update_sql, (21, 张三)) conn.commit() print(f更新成功影响行数{cursor.rowcount}) except pymysql.Error as e: conn.rollback() print(f更新失败{e}) # 3.4 删除数据 try: delete_sql DELETE FROM user WHERE age %s cursor.execute(delete_sql, (18,)) conn.commit() print(f删除成功影响行数{cursor.rowcount}) except pymysql.Error as e: conn.rollback() print(f删除失败{e})关闭连接必须操作使用完数据库后需关闭游标和连接释放资源# 4. 关闭游标和连接 cursor.close() conn.close()进阶技巧使用上下文管理器自动关闭连接 / 游标通过with语句可以自动管理连接和游标无需手动关闭推荐使用import pymysql config { host: localhost, port: 3306, user: root, password: 你的密码, database: test_db, charset: utf8mb4, cursorclass: pymysql.cursors.DictCursor # 全局指定字典游标 } # 上下文管理器自动处理连接/游标关闭 with pymysql.connect(**config) as conn: with conn.cursor() as cursor: # 执行查询 cursor.execute(SELECT * FROM user LIMIT 2) results cursor.fetchall() print(results) # 增删改操作需手动commitwith仅管理关闭不自动提交 # conn.commit()处理 SQL 注入问题绝对不要用字符串拼接 SQL会导致 SQL 注入必须使用%s占位符传递参数# 错误示例有注入风险 name 张三; DROP TABLE user; -- sql fSELECT * FROM user WHERE name {name} # 执行后会删除表 # 正确示例使用占位符 sql SELECT * FROM user WHERE name %s cursor.execute(sql, (name,)) # pymysql会自动转义参数避免注入设置超时时间避免连接 / 查询卡死可设置连接超时和查询超时conn pymysql.connect( hostlocalhost, userroot, password密码, databasetest_db, connect_timeout10, # 连接超时秒 read_timeout30, # 读取数据超时秒 write_timeout30 # 写入数据超时秒 )常见问题与解决方案报错Access denied for user ‘root’‘localhost’原因用户名 / 密码错误或 MySQL 用户无访问权限解决检查密码或给 MySQL 用户授权GRANT ALL ON test_db.* TO root% IDENTIFIED BY 密码; FLUSH PRIVILEGES;报错Can’t connect to MySQL server on ‘localhost’ (10061)原因MySQL 服务未启动或端口号错误解决启动 MySQL 服务检查 port 参数是否为 3306或实际端口中文乱码原因字符编码不一致解决连接时指定charsetutf8mb4且数据库 / 表的编码也设置为 utf8mb4总结pymysql是 Python 操作 MySQL 的核心库核心流程为建立连接→创建游标→执行 SQL→处理结果→提交事务增删改→关闭资源必须使用%s占位符传递参数避免 SQL 注入增删改操作需手动commit()出错时rollback()推荐使用上下文管理器with 语句管理连接 / 游标减少手动关闭的遗漏提升代码健壮性