Python3 MySQL 数据库连接 – PyMySQL 驱动(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在现代软件开发中,数据库连接是构建应用程序的核心能力之一。无论是构建 Web 应用、数据分析工具还是自动化脚本,与数据库的交互都至关重要。Python 作为一门灵活且功能强大的语言,通过第三方库 PyMySQL,能够高效地实现与 MySQL 数据库的连接和操作。本文将从基础到进阶,逐步讲解如何使用 PyMySQL 实现 Python3 与 MySQL 的数据交互,并通过实际案例帮助读者掌握关键知识点。


一、PyMySQL 的核心概念与安装配置

1.1 什么是 PyMySQL?

PyMySQL 是一个纯 Python 编写的 MySQL 客户端库,它实现了 Python 数据库 API 规范 v2.0,并且兼容 Python3。与官方的 MySQL Connector/Python 相比,PyMySQL 的优势在于其轻量级、跨平台特性,以及对中文编码的支持更为友好。

可以将 PyMySQL 想象为一位“快递员”,它负责在 Python 程序与 MySQL 数据库之间传递数据。例如,当程序需要查询数据时,PyMySQL 会将 SQL 语句发送给数据库,再将结果“打包”返回给程序。

1.2 安装与配置

安装 PyMySQL 非常简单,只需通过 pip 命令即可完成:

pip install PyMySQL  

安装完成后,需要确保 MySQL 服务已启动,并且数据库的访问权限已配置。例如,如果数据库运行在本地,且用户名为 root、密码为 password,可以使用以下代码测试连接:

import pymysql  

try:  
    # 连接到 MySQL 服务器  
    conn = pymysql.connect(  
        host="localhost",  
        user="root",  
        password="password",  
        database="test_db",  
        charset="utf8mb4"  
    )  
    print("连接成功!")  
except Exception as e:  
    print(f"连接失败: {str(e)}")  
finally:  
    conn.close()  

注意

  • 如果遇到权限问题,需检查 MySQL 用户的访问权限是否允许从当前 IP 地址连接。
  • charset="utf8mb4" 是推荐的设置,以支持完整的 Unicode 编码(如表情符号)。

二、基础操作:连接、查询与关闭

2.1 连接数据库的完整流程

PyMySQL 的连接过程分为以下步骤:

  1. 建立连接:通过 connect() 方法创建与数据库的通信通道。
  2. 获取游标:游标(Cursor)是执行 SQL 语句、获取结果的核心对象,类似于“导航指针”。
  3. 执行 SQL 语句:通过游标对象的 execute() 方法执行查询或修改操作。
  4. 提交或回滚:对数据库进行修改(如插入、更新、删除)时,需调用 commit() 提交事务,或 rollback() 回滚操作。
  5. 关闭连接:释放资源,避免连接泄漏。

以下是一个完整的示例:

import pymysql  

config = {  
    "host": "localhost",  
    "user": "root",  
    "password": "password",  
    "database": "my_db",  
    "charset": "utf8mb4"  
}  

try:  
    # 建立连接  
    conn = pymysql.connect(**config)  
    cursor = conn.cursor()  

    # 执行查询  
    cursor.execute("SELECT * FROM users WHERE age > 25")  
    results = cursor.fetchall()  
    for row in results:  
        print(f"用户ID: {row[0]}, 姓名: {row[1]}, 年龄: {row[2]}")  

except Exception as e:  
    print(f"操作失败: {str(e)}")  
    conn.rollback()  # 回滚事务  
finally:  
    cursor.close()  
    conn.close()  

2.2 常见 SQL 操作示例

2.2.1 查询数据

查询操作通常使用 SELECT 语句,并通过 fetchone()fetchmany()fetchall() 方法获取结果:

cursor.execute("SELECT * FROM users WHERE id = 1")  
user = cursor.fetchone()  
print(user)  # 输出元组格式,如 (1, 'Alice', 30)  

cursor.execute("SELECT * FROM users LIMIT 5")  
users = cursor.fetchmany(3)  # 获取前 3 条记录  

2.2.2 插入数据

插入数据时,可以使用参数化查询(避免 SQL 注入):

sql = "INSERT INTO users (name, age) VALUES (%s, %s)"  
cursor.execute(sql, ("Bob", 28))  
conn.commit()  

users = [("Charlie", 22), ("Diana", 35)]  
sql = "INSERT INTO users (name, age) VALUES (%s, %s)"  
cursor.executemany(sql, users)  
conn.commit()  

2.2.3 更新与删除

更新和删除操作与插入类似,但需注意事务的提交:

cursor.execute("UPDATE users SET age = 31 WHERE name = 'Alice'")  
conn.commit()  

cursor.execute("DELETE FROM users WHERE id = 2")  
conn.commit()  

三、高级技巧与优化

3.1 使用上下文管理器(with 语句)

通过 with 语句可以自动管理连接和游标的关闭,避免手动调用 close()

import pymysql  

config = {  
    "host": "localhost",  
    "user": "root",  
    "password": "password",  
    "database": "my_db"  
}  

with pymysql.connect(**config) as conn:  
    with conn.cursor() as cursor:  
        cursor.execute("SELECT * FROM users")  
        print(cursor.fetchall())  

3.2 事务控制

在需要保证数据一致性的场景(如转账操作),可以显式开启事务:

try:  
    with pymysql.connect(**config) as conn:  
        conn.begin()  # 开始事务  
        cursor = conn.cursor()  

        cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1")  
        cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2")  

        conn.commit()  # 提交事务  
except Exception as e:  
    conn.rollback()  # 发生错误时回滚  

3.3 游标类型与性能优化

PyMySQL 提供了多种游标类型,以适应不同场景:

游标类型描述
Cursor默认游标,返回元组列表,适合小数据量查询。
DictCursor返回字典格式结果,便于通过列名访问数据。
SSCursor服务器端游标,适合大数据量查询(逐行获取数据,减少内存占用)。

示例代码:

with conn.cursor(pymysql.cursors.DictCursor) as cursor:  
    cursor.execute("SELECT * FROM users")  
    for row in cursor:  
        print(f"用户姓名: {row['name']}, 年龄: {row['age']}")  

3.4 预编译语句与性能提升

预编译语句(Prepared Statements)可以避免 SQL 注入,并提高重复执行的效率:

with conn.cursor() as cursor:  
    sql = "INSERT INTO logs (user_id, action) VALUES (%s, %s)"  
    cursor.prepare(sql)  # 预编译  
    for _ in range(1000):  
        cursor.execute(None, (1, "login"))  # 执行预编译语句  
    conn.commit()  

四、常见问题与解决方案

4.1 连接超时或拒绝连接

原因:MySQL 服务未启动、防火墙阻止端口(默认 3306)或用户权限配置错误。
解决方法

  • 检查 MySQL 服务状态:systemctl status mysql
  • 临时开放端口:sudo ufw allow 3306
  • 验证用户权限:登录 MySQL 后执行 SELECT User, Host FROM mysql.user;

4.2 SQL 注入风险

防范措施

  • 使用参数化查询,避免字符串拼接 SQL 语句。
  • 限制数据库用户的权限(如只允许查询,而非修改)。

4.3 连接泄漏问题

解决方法

  • 始终在 finally 块或 with 语句中关闭连接。
  • 使用连接池(如 pymysqlpool 库)管理多个连接,避免频繁创建和销毁连接。

结论

通过本文的讲解,读者应已掌握 PyMySQL 的核心用法,包括连接配置、基础 SQL 操作、事务控制以及性能优化技巧。PyMySQL 作为 Python 与 MySQL 的桥梁,不仅简化了数据库交互的复杂性,还提供了灵活的接口以应对不同场景的需求。

对于初学者,建议从简单查询开始实践,并逐步尝试编写完整的 CRUD(增删改查)功能;中级开发者则可以深入探索连接池、分布式事务等高级主题。随着实践的深入,PyMySQL 将成为构建数据驱动应用的得力工具。

如需进一步学习,可参考官方文档或尝试将 PyMySQL 与 Web 框架(如 Django 或 Flask)结合使用,以实现更复杂的应用场景。

最新发布