Python3 MySQL 数据库连接 – PyMySQL 驱动详解
                           
天天向上
发布: 2025-03-16 11:56:30

原创
25 人浏览过

PyMySQL 是 Python 访问 MySQL 数据库的一个纯 Python 实现的驱动程序,功能强大且支持 Python 3。
本教程将 从安装、基本操作,到事务管理、高级应用,一步步带你掌握 PyMySQL 的使用。


1. 安装 PyMySQL

在使用 PyMySQL 之前,我们需要先安装它:

pip install pymysql

如果你使用 conda

conda install -c conda-forge pymysql

解说:

  • pip install pymysql 用于安装 PyMySQL 驱动。
  • conda install -c conda-forge pymysql 适用于 Anaconda 发行版。

2. 连接 MySQL 数据库

2.1 基本连接

import pymysql

# 创建数据库连接
conn = pymysql.connect(
    host="localhost",     # 服务器地址
    user="root",          # 用户名
    password="123456",    # 密码
    database="test_db",   # 数据库名称
    charset="utf8mb4"     # 指定编码
)

print("连接成功!")

# 关闭连接
conn.close()

解说:

  • pymysql.connect() 创建 MySQL 连接对象。
  • host="localhost" 连接本机数据库(远程可以填写 IP)。
  • user="root"password="123456" 需要与 MySQL 账号匹配。
  • database="test_db" 连接到指定数据库。
  • charset="utf8mb4" 保证支持中文存储

3. 使用游标(Cursor)执行 SQL

PyMySQL 中,游标(cursor)用于执行 SQL 语句。

3.1 获取游标

cursor = conn.cursor()

解说:

  • cursor() 方法创建游标对象,用于执行 SQL 语句。

3.2 创建数据库

cursor.execute("CREATE DATABASE IF NOT EXISTS test_db")
print("数据库创建成功!")

解说:

  • CREATE DATABASE 创建数据库,IF NOT EXISTS 避免重复创建。

3.3 创建表

cursor.execute("""
    CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100),
        age INT
    )
""")
print("表创建成功!")

解说:

  • AUTO_INCREMENT 设置 id 为自增主键。
  • PRIMARY KEY 设定 id 为唯一标识。

3.4 插入数据

sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
data = ("张三", 25)
cursor.execute(sql, data)
conn.commit()
print("数据插入成功!")

解说:

  • 使用 (%s, %s) 作为 占位符,防止 SQL 注入。
  • cursor.execute(sql, data) 传入参数以安全执行 SQL 语句。
  • conn.commit() 提交事务,否则数据不会保存。

3.5 查询数据

sql = "SELECT * FROM users"
cursor.execute(sql)

for row in cursor.fetchall():
    print(row)

解说:

  • fetchall() 获取所有查询结果,返回 列表

3.6 更新数据

sql = "UPDATE users SET age = %s WHERE name = %s"
cursor.execute(sql, (30, "张三"))
conn.commit()
print("数据更新成功!")

解说:

  • UPDATE users SET age = 30 WHERE name = '张三' 修改数据。

3.7 删除数据

sql = "DELETE FROM users WHERE name = %s"
cursor.execute(sql, ("张三",))
conn.commit()
print("数据删除成功!")

解说:

  • DELETE FROM users WHERE name = '张三' 删除匹配数据。

4. 事务管理

MySQL 默认不自动提交事务(autocommit=False),我们需要手动管理事务。

4.1 开启事务

conn.begin()

4.2 提交事务

conn.commit()

4.3 回滚事务

conn.rollback()

4.4 事务示例

try:
    conn.begin()
    cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("李四", 28))
    cursor.execute("UPDATE users SET age = 35 WHERE name = '王五'")
    conn.commit()
    print("事务提交成功!")
except:
    conn.rollback()
    print("事务回滚!")

解说:

  • begin() 开启事务。
  • commit() 确保所有 SQL 成功执行后提交。
  • rollback() 遇到错误时撤销所有更改。

5. 存储过程

存储过程可以提高数据库性能,减少 Python 到 MySQL 的交互次数。

5.1 创建存储过程

DELIMITER //
CREATE PROCEDURE GetAllUsers()
BEGIN
    SELECT * FROM users;
END //
DELIMITER ;

5.2 Python 调用存储过程

cursor.callproc("GetAllUsers")

for result in cursor.stored_results():
    print(result.fetchall())

解说:

  • callproc("存储过程名") 直接调用数据库端的存储过程,提高查询性能。

6. 性能优化

6.1 使用 DictCursor 返回字典格式

cursor = conn.cursor(pymysql.cursors.DictCursor)

解说:

  • 返回 字典 而非元组,方便 Python 处理数据。

6.2 开启 autocommit

conn.autocommit(True)

解说:

  • 适用于高并发查询,减少 commit() 开销。

6.3 使用索引

CREATE INDEX idx_name ON users(name);

解说:

  • 索引加速查询,减少 WHERE 语句的扫描时间。

7. 连接池

使用 PyMySQL 连接池减少连接开销:

from pymysqlpool.pool import Pool

pool = Pool(host="localhost", user="root", password="123456", database="test_db", size=5)

conn = pool.get_conn()
print("从连接池获取连接!")
conn.close()

解说:

  • size=5 允许最多 5 个数据库连接,提高性能。

8. 关闭连接

cursor.close()
conn.close()

解说:

  • 必须关闭连接,避免 MySQL 连接泄漏。

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *