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

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

相关推荐
傻啦嘿哟2 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670792 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
2601_962077602 小时前
python Dejavu库快速识别音频指纹实例探究
python·音乐识别·dejavu库·音频指纹识别·实例探究
科技苑2 小时前
如何用Python编程实现一个简单的Web爬虫?
人工智能·python
程序员清风2 小时前
Java 后端高并发设计:线程池、限流、熔断与降级
java·数据库·oracle
李少兄2 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
天衍四九-2 小时前
MySQL中如何定位慢查询?如果SQL语句执行很慢,如何分析和优化?
数据库·sql·mysql
dayDayupbetter3 小时前
Visual C++ 2010安装与使用高手秘籍
python
隐擎fox3 小时前
深入理解网络传输层安全:TLS 指纹识别(JA3/JA4)原理与 Python 协议层检测实战
爬虫·python·网络协议·安全·网络安全·https
尚久龙3 小时前
mysql-5.7.26-winx64的安装步骤
数据库·mysql