一、前言:

Python 作为最流行的编程语言之一,与关系型数据库 MySQL 的结合非常常见。无论是 Web 开发、数据分析还是自动化脚本,掌握 Python 操作 MySQL 都是一项必备技能。

本文将带你 从零开始,使用 PyMySQL 库完成 MySQL 数据库的连接、建表、增删改查等完整流程,并提供一份可以直接运行的实战代码。无论你是刚接触数据库的新手,还是想规范代码风格的老手,这篇文章都能给你提供参考。

二、准备工作

2.1 安装 PyMySQL

PyMySQL 是 Python 中连接 MySQL 的第三方库,纯 Python 实现,兼容 MySQL 5.x 和 8.x。

下载对应的安装包:

pip install pymysql

如果你使用了较新版本的 MySQL(8.0+),建议同时安装 cryptography 以支持新认证插件:

pip install pymysql cryptography

2.2 启动 MySQL 服务

确保你的 MySQL 服务已启动,并知道以下连接信息:

  • 主机地址(通常为 localhost 或 127.0.0.1

  • 端口(默认 3306

  • 用户名(如 root

  • 密码

  • 数据库名(需提前创建,或通过代码自动创建)


三、连接 MySQL 数据库的核心步骤

使用 PyMySQL 连接数据库只需四步:

  1. 创建连接对象:调用 pymysql.Connect(),传入连接参数。

  2. 获取游标对象:通过 conn.cursor() 获取,用于执行 SQL。

  3. 执行 SQL 语句:使用 cursor.execute(sql, params)

  4. 关闭游标和连接:释放资源。

3.1 基本连接示例

import pymysql

# 连接参数
config = {
    'host': 'localhost',
    'port': 3306,
    'user': 'root',
    'password': '123456',
    'db': 'test_db',          # 必须已经存在的数据库
    'charset': 'utf8mb4',
    'autocommit': True        # 自动提交事务
}

# 1. 建立连接
conn = pymysql.Connect(**config)

# 2. 创建游标
cursor = conn.cursor()

# 3. 执行查询
cursor.execute("SELECT VERSION()")
version = cursor.fetchone()
print(f"MySQL 版本: {version[0]}")

# 4. 关闭资源
cursor.close()
conn.close()

注意db 参数指定的数据库必须已存在,否则连接会失败。若数据库不存在,可先连接到默认库(如 mysql)再创建目标库,下文会给出自动建库的方法。


四、完整实战:用户表增删改查

下面我们设计一个完整的示例,涵盖:

  • 自动创建数据库(如果不存在)

  • 创建 Users 表

  • 插入多条数据

  • 删除指定用户

  • 修改用户密码

  • 查询并展示所有数据

4.1 完整代码结构

整个流程封装在一个脚本中,便于理解和复用。

# encoding=utf8
 
'''python连接MySQL数据库,实现:增-删-改-查'''
 
# 需要安装三方库
# pip install pymysql==1.1.0

import pymysql

DB_HOST = "localhost"
DB_PORT = 3306
DB_USERNAME = "root"
DB_PASSWORD = "123456"
DB_DATABASE = "LiMing"

# 1. 先连接默认数据库,创建目标库
temp_conn = pymysql.Connect(host=DB_HOST, port=DB_PORT, user=DB_USERNAME, password=DB_PASSWORD, charset="utf8")
temp_cur = temp_conn.cursor()
temp_cur.execute(f"CREATE DATABASE IF NOT EXISTS `{DB_DATABASE}` CHARACTER SET utf8mb4")
temp_cur.close()
temp_conn.close()

# 2. 正式连接目标库
conn = pymysql.Connect(host=DB_HOST, port=DB_PORT, user=DB_USERNAME, password=DB_PASSWORD,
                       db=DB_DATABASE, charset="utf8", autocommit=True)
cur = conn.cursor()

# 3. 创建表 Users
try:
    cur.execute("""
        CREATE TABLE IF NOT EXISTS `Users` (
            `id` INT NOT NULL AUTO_INCREMENT,
            `username` VARCHAR(32) NULL,
            `password` VARCHAR(32) NULL,
            `datatime` DATETIME NULL,
            PRIMARY KEY (`id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    """)
    print("创建/检查 Users 表成功")
except Exception as e:
    print("创建表失败:", e)

# 4. 插入数据(使用参数化查询避免注入)
users = [
    (1, '张三', '123456', '2024-03-28'),
    (2, '李四', '123456', '2024-03-29'),
    (3, '王五', '123456', '2024-03-30')
]
try:
    for u in users:
        cur.execute(
            "INSERT IGNORE INTO `Users` (id, username, password, datatime) VALUES (%s, %s, %s, %s)",
            u
        )
    print("数据插入成功")
except Exception as e:
    print("插入失败:", e)

# 5. 删除李四
try:
    cur.execute("DELETE FROM `Users` WHERE username = %s", ('李四',))
    print("删除成功")
except Exception as e:
    print("删除失败:", e)

# 6. 修改张三密码
try:
    cur.execute("UPDATE `Users` SET password = %s WHERE username = %s", ('456789', '张三'))
    print("修改成功")
except Exception as e:
    print("修改失败:", e)

# 7. 查询并显示所有数据
cur.execute("SELECT * FROM `Users`")
rows = cur.fetchall()
for row in rows:
    print(row)

# 关闭连接
cur.close()
conn.close()

五、重点知识详解

5.1 连接参数说明

参数名 说明 示例
host MySQL 服务器地址 'localhost' 或 '192.168.1.100'
port 端口号,默认 3306 3306
user 登录用户名 'root'
password 登录密码 '123456'
db 要连接的数据库名 'mydb'
charset 字符集,推荐 utf8mb4 'utf8mb4'
autocommit 是否自动提交事务 True 或 False

5.2 游标(Cursor)的作用

游标是执行 SQL 的“管道”,所有 SQL 语句都必须通过游标发送。常用的游标方法:

  • execute(sql, params):执行单条 SQL。

  • executemany(sql, seq_of_params):批量执行。

  • fetchone():获取一行结果。

  • fetchall():获取所有行。

  • fetchmany(size):获取指定行数。

5.3 参数化查询(防SQL注入)

禁止直接拼接字符串(如 f"SELECT * FROM users WHERE name='{name}'"),这极易引发 SQL 注入攻击。

正确做法:使用 %s 占位符,并将实际值作为参数传入,PyMySQL 会自动转义。

# 安全写法
cursor.execute("SELECT * FROM users WHERE name = %s", (username,))

5.4 事务处理

如果不开启 autocommit=True,则需要显式调用 conn.commit() 提交更改,或 conn.rollback() 回滚。

try:
    cursor.execute("INSERT ...")
    cursor.execute("UPDATE ...")
    conn.commit()          # 提交事务
except Exception:
    conn.rollback()        # 出错回滚

5.5 关闭连接

使用完数据库后,务必关闭游标和连接,释放资源。

cursor.close()
conn.close()

更好的做法是使用 with 上下文管理器(但 PyMySQL 本身不直接支持,可自定义)。


六、常见问题与排查思路

问题现象 可能原因 解决方法
Can't connect to MySQL server MySQL 服务未启动,或主机/端口错误 检查服务状态,确认 IP 和端口
Access denied for user 用户名或密码错误 核对账号密码,注意大小写
Unknown database 'xxx' 目标数据库不存在 先创建数据库(参考本文的自动建库)
Packet sequence number wrong 连接超时或网络不稳定 增加 connect_timeout 参数,或检查防火墙
中文乱码 字符集不匹配 统一使用 utf8mb4,并在连接和表上都指定该字符集

七、总结

通过本文,你应该已经掌握了:

  1. 使用 PyMySQL 连接 MySQL 数据库的基本步骤。

  2. 自动创建数据库和表,实现环境初始化。

  3. 安全地执行增删改查操作,避免 SQL 注入。

  4. 正确管理连接和游标,释放资源。

  5. 常见问题的快速排查方法。

本文提供的完整示例可以直接复制到你的项目中,稍作修改即可投入使用。数据库编程是 Python 开发的重要基石,希望这篇文章能成为你进阶路上的有力参考。

如果你有任何疑问或建议,欢迎在评论区留言交流!

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐