Python连接MySQL数据库:从入门到实战(PyMySQL详解

一、前言:

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

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

二、准备工作

2.1 安装 PyMySQL

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

下载对应的安装包:

bash 复制代码
pip install pymysql

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

bash 复制代码
pip install pymysql cryptography

2.2 启动 MySQL 服务

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

  • 主机地址(通常为 localhost127.0.0.1

  • 端口(默认 3306

  • 用户名(如 root

  • 密码

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


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

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

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

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

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

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

3.1 基本连接示例

python 复制代码
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 完整代码结构

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

python 复制代码
# 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 是否自动提交事务 TrueFalse

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() 回滚。

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

5.5 关闭连接

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

python 复制代码
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 开发的重要基石,希望这篇文章能成为你进阶路上的有力参考。

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

相关推荐
格兰芬多呼神护卫21 小时前
# Agent 企业评估方案深度分析:从“看答案”到持续质量闭环_码士教育
java·开发语言·jvm
万亿少女的梦16821 小时前
基于Spring Boot、Vue.js与MySQL的流浪猫狗救助系统设计与实现
vue.js·spring boot·mysql·javaweb·权限管理
这就是佬们吗21 小时前
回溯算法三板斧---掌握「回溯三问」思考模板快速入门回溯
java·数据库·算法
青皮桔21 小时前
Redis AOF 文件损坏修复记录
运维·数据库·redis
happyh h h h p p p p21 小时前
LVS 项目完整知识点总结
linux·服务器·数据库
冻柠檬飞冰走茶21 小时前
PTA基础编程题目集 7-24 约分最简分式(C语言实现)
c语言·开发语言·数据结构·算法
程序员三藏21 小时前
自动化测试详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
要开心吖ZSH21 小时前
一次 HikariCP 连接池耗尽导致的线上雪崩排查实录——完整排查报告
java·spring boot·mysql·连接池·hikaricp
万亿少女的梦16821 小时前
基于SSM、JSP与MySQL的秦皇岛旅游服务管理系统设计与实现
mysql·mybatis·ssm·jsp·spring mvc
szwyyx21 小时前
目前知名的BEL电源分销商哪家性价比高
人工智能·python