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

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

相关推荐
闻道且行之14 小时前
图片处理助手|泊松融合原理 + C++ 工程实现,seamlessClone 三模式一次讲透
数据库·c++·人工智能·opencv
05664615 小时前
agent学习——流式响应与文本切分
网络·python·学习
学习星球15 小时前
Solid.js 实战:拆解官方 RealWorld 项目
开发语言·javascript·vue.js
OPEN-F15 小时前
Python进阶教程:正则表达式进阶与文本处理
开发语言·python·正则表达式
新网企兴15 小时前
2026年陕西做GEO推广,找新网企兴解决获客难题
python·搜索引擎
zhifou12345615 小时前
java 17升级安装
java·开发语言
青 春 记 忆15 小时前
LeetCode 142. 环形链表 II|Python 解法详解
python·leetcode·链表
夏炳辉.15 小时前
PostgreSQL 高可用集群核心配置参数全解:从原生流复制到 Patroni 企业级方案
数据库·postgresql
for_ever_love__15 小时前
python基础语法学习: 面向对象的三大特性
开发语言·python·学习
Spider赵毅15 小时前
Python爬虫踩坑实录:BeautifulSoup使用中的高频问题排查
爬虫·python·beautifulsoup