Python3 MySQL 数据库连接 – PyMySQL 驱动(完整指南)

Python3 MySQL 数据库连接 – PyMySQL 驱动:从零开始的实战指南

在开发 Web 应用、数据处理工具或后端服务时,数据库是不可或缺的一环。而 Python 作为一门简洁高效的编程语言,与 MySQL 的结合尤为紧密。今天,我们就来深入探讨如何使用 PyMySQL 驱动实现 Python3 与 MySQL 数据库的连接与操作。

你可能会问:为什么是 PyMySQL?因为它是 Python 官方推荐的 MySQL 驱动之一,支持 Python 3,并且安装简单、性能稳定。它就像一座“桥梁”,让 Python 程序能够与 MySQL 数据库进行沟通,发送 SQL 命令、获取数据、更新记录。

接下来的内容,我们将一步步带你从环境准备到实际操作,手把手教你掌握 Python3 MySQL 数据库连接 – PyMySQL 驱动的核心技能。


安装与环境准备

在开始写代码前,我们得先搭建好环境。这一步就像盖房子前的打地基,不容马虎。

首先,确保你的系统中已经安装了 Python 3.6 或更高版本。你可以通过终端输入以下命令检查:

python3 --version

如果输出类似 Python 3.9.16,说明环境没问题。

接着,我们需要安装 PyMySQL。它是一个纯 Python 编写的 MySQL 客户端库,无需编译,直接用 pip 安装即可:

pip install PyMySQL

安装完成后,可以用下面的代码验证是否成功:

import pymysql

print("PyMySQL 安装成功!")

如果没有任何报错,说明你已经准备就绪。

💡 提示:如果你使用的是虚拟环境(推荐做法),请确保在激活环境后执行 pip 安装命令。


建立数据库连接:连接字符串详解

连接数据库,就像打电话给对方。你需要知道对方的“电话号码”(IP 地址)、“门牌号”(端口)、“用户名”和“密码”。在数据库的世界里,这些就是连接参数。

我们来写一个基础的连接代码:

import pymysql

host = 'localhost'        # 数据库服务器地址,本地用 localhost
port = 3306               # MySQL 默认端口
user = 'root'             # 数据库用户名
password = 'your_password'  # 数据库密码
database = 'test_db'      # 要连接的数据库名

connection = pymysql.connect(
    host=host,
    port=port,
    user=user,
    password=password,
    database=database,
    charset='utf8mb4'     # 推荐使用 utf8mb4 支持中文和 emoji
)

print("数据库连接成功!")

connection.close()

代码注释说明:

  • host:数据库服务器地址。本地测试时用 localhost,线上则用真实 IP 或域名。
  • port:MySQL 默认端口是 3306,除非你修改过。
  • userpassword:数据库的登录凭证,务必保密。
  • database:要操作的数据库名称,必须提前创建。
  • charset='utf8mb4':这是关键!utf8 在 MySQL 中有字符限制,而 utf8mb4 支持完整的 Unicode 字符,包括 emoji,强烈建议使用。

⚠️ 注意:在生产环境中,不要将密码硬编码在代码中。可以使用环境变量或配置文件。


创建数据库与表:动手实践

在连接成功后,我们来创建一个数据库和一张表,作为后续操作的基础。

假设我们要管理一个“学生信息表”,包含学号、姓名、年龄和成绩。

import pymysql

connection = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='your_password',
    charset='utf8mb4'
)

try:
    # 使用 cursor 创建游标对象
    with connection.cursor() as cursor:
        # 创建数据库(如果不存在)
        create_db_sql = "CREATE DATABASE IF NOT EXISTS school_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
        cursor.execute(create_db_sql)
        print("数据库 school_db 创建成功或已存在")

        # 切换到目标数据库
        connection.select_db('school_db')

        # 创建学生表
        create_table_sql = """
        CREATE TABLE IF NOT EXISTS students (
            id INT AUTO_INCREMENT PRIMARY KEY,
            student_id VARCHAR(20) NOT NULL UNIQUE,
            name VARCHAR(50) NOT NULL,
            age INT,
            score DECIMAL(5,2)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
        """
        cursor.execute(create_table_sql)
        print("学生表 students 创建成功或已存在")

    # 提交事务
    connection.commit()

except Exception as e:
    print(f"操作失败:{e}")
    connection.rollback()  # 出错时回滚

finally:
    connection.close()
    print("数据库连接已关闭")

关键点解析:

  • pymysql.connect() 建立连接后,必须调用 connection.select_db('school_db') 切换到具体数据库。
  • cursor() 是执行 SQL 的“工具手”,所有 SQL 操作都要通过它完成。
  • try...except...finally 是标准的异常处理结构,确保即使出错也能关闭连接。
  • connection.commit() 提交事务,否则更改不会生效。
  • AUTO_INCREMENT:自动递增主键,用于生成唯一 ID。
  • UNIQUE:保证学号不重复,避免数据冲突。

数据增删改查(CRUD)操作实战

现在数据库和表都准备好了,接下来我们来实现最常用的四种操作:增、删、改、查。

1. 插入数据(Insert)

import pymysql

connection = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='your_password',
    database='school_db',
    charset='utf8mb4'
)

try:
    with connection.cursor() as cursor:
        # 插入一条学生记录
        insert_sql = """
        INSERT INTO students (student_id, name, age, score)
        VALUES (%s, %s, %s, %s)
        """
        # 参数使用 %s 占位符,防止 SQL 注入
        data = ('S2024001', '张三', 18, 95.5)
        cursor.execute(insert_sql, data)
        print(f"插入成功,影响行数:{cursor.rowcount}")

    # 提交事务
    connection.commit()

except Exception as e:
    print(f"插入失败:{e}")
    connection.rollback()

finally:
    connection.close()

🔒 安全提示:永远不要拼接 SQL 字符串!使用 %s 占位符,PyMySQL 会自动转义,防止 SQL 注入攻击。


2. 查询数据(Select)

import pymysql

connection = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='your_password',
    database='school_db',
    charset='utf8mb4'
)

try:
    with connection.cursor() as cursor:
        # 查询所有学生
        select_sql = "SELECT id, student_id, name, age, score FROM students"
        cursor.execute(select_sql)
        
        # 获取所有结果
        results = cursor.fetchall()
        
        # 打印结果
        print("查询结果:")
        for row in results:
            print(f"ID: {row[0]}, 学号: {row[1]}, 姓名: {row[2]}, 年龄: {row[3]}, 成绩: {row[4]}")

except Exception as e:
    print(f"查询失败:{e}")

finally:
    connection.close()

📌 小技巧:cursor.fetchall() 返回所有结果,fetchone() 只取第一条,fetchmany(n) 取前 n 条。


3. 更新数据(Update)

import pymysql

connection = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='your_password',
    database='school_db',
    charset='utf8mb4'
)

try:
    with connection.cursor() as cursor:
        # 更新某位学生的成绩
        update_sql = "UPDATE students SET score = %s WHERE student_id = %s"
        new_score = 98.0
        student_id = 'S2024001'
        cursor.execute(update_sql, (new_score, student_id))
        
        print(f"更新成功,影响行数:{cursor.rowcount}")

    connection.commit()

except Exception as e:
    print(f"更新失败:{e}")
    connection.rollback()

finally:
    connection.close()

4. 删除数据(Delete)

import pymysql

connection = pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='your_password',
    database='school_db',
    charset='utf8mb4'
)

try:
    with connection.cursor() as cursor:
        # 删除学号为 S2024001 的学生
        delete_sql = "DELETE FROM students WHERE student_id = %s"
        student_id = 'S2024001'
        cursor.execute(delete_sql, (student_id,))
        
        print(f"删除成功,影响行数:{cursor.rowcount}")

    connection.commit()

except Exception as e:
    print(f"删除失败:{e}")
    connection.rollback()

finally:
    connection.close()

最佳实践与性能优化建议

在实际项目中,频繁连接数据库会带来性能损耗。以下是几个关键建议:

优化建议 说明
使用连接池 通过 pymysqlpoolSQLAlchemy 管理连接,避免重复创建
避免全局连接 每次操作使用 with connection.cursor() 自动管理
合理使用事务 批量操作时用 commit() 批量提交,减少 IO 开销
设置超时时间 添加 connect_timeout=10 防止连接卡死
使用上下文管理器 with 语句自动关闭连接,防止资源泄露

总结:Python3 MySQL 数据库连接 – PyMySQL 驱动的完整路径

通过这篇文章,你已经掌握了 Python3 MySQL 数据库连接 – PyMySQL 驱动的核心技能:从环境搭建、连接配置,到数据库与表的创建,再到增删改查的完整操作流程。

关键在于:理解连接的本质是“通信桥梁”,而 PyMySQL 就是这座桥的建造者。只要掌握好参数配置、SQL 执行与异常处理,你就能轻松驾驭数据库操作。

记住,安全第一:永远使用占位符 %s,避免 SQL 注入;连接后及时关闭,防止资源浪费。

无论你是初学者,还是正在开发项目,这篇文章都为你提供了一套可直接复用的模板和最佳实践。动手试试吧,让 Python 和 MySQL 的组合为你打造更强大的应用!

下一次,我们可能会聊聊如何用 PyMySQL 配合 Flask 构建一个简单的 Web 后台管理系统。敬请期待。