Python MySQL – mysql-connector 驱动详解
                           
天天向上
发布: 2025-03-15 19:59:17

原创
524 人浏览过

在 Python 中,mysql-connector-python 是 MySQL 官方提供的驱动程序,能够帮助我们在 Python 代码中与 MySQL 数据库交互。
本教程将 从安装、基本操作,到事务管理、高级应用 一步步带你掌握 mysql-connector-python,并且每个部分都有详细解说。


1. 安装 mysql-connector-python

在使用 mysql-connector-python 之前,我们需要先安装它:

pip install mysql-connector-python

如果你使用 conda

conda install -c conda-forge mysql-connector-python

解说:

  • pip install 是 Python 的包管理器,用于安装 MySQL 连接器。
  • conda install 适用于 Anaconda 发行版。

2. 连接 MySQL 数据库

2.1 基本连接

import mysql.connector

conn = mysql.connector.connect(
    host="localhost",
    user="root",
    password="123456",
    database="test_db"
)

print("连接成功!")

conn.close()

解说:

  • mysql.connector.connect() 用于创建数据库连接对象。
  • host="localhost" 表示连接本机数据库(远程可以填写 IP)。
  • userpassword 需要与 MySQL 的账号匹配。
  • database="test_db" 连接到指定的数据库。

3. 执行 SQL 语句

mysql-connector-python 中,我们使用 游标(cursor) 来执行 SQL 语句。

3.1 创建游标

cursor = conn.cursor()

解说:
游标 cursor 是 Python 用于执行 SQL 语句的对象,它可以:

  • 执行 SELECT 查询获取数据。
  • 执行 INSERT/UPDATE/DELETE 修改数据库内容。

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 注入。
  • execute(sql, data) 传入参数以安全执行 SQL 语句。
  • conn.commit() 提交更改,否则数据不会被写入数据库。

3.5 查询数据

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

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

解说:

  • execute("SELECT * FROM users") 运行查询。
  • 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 在每次执行 SQL 后不会自动提交(除非 autocommit=True),所以我们需要手动控制 事务

4.1 开启事务

conn.start_transaction()

4.2 提交事务

conn.commit()

4.3 回滚事务

conn.rollback()

4.4 事务示例

try:
    conn.start_transaction()
    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("事务回滚!")

解说:

  • start_transaction() 开启事务。
  • commit() 只有在所有 SQL 语句成功执行时才会提交。
  • rollback() 遇到错误时撤销所有更改。

5. 批量操作

5.1 批量插入

python复制编辑sql = "INSERT INTO users (name, age) VALUES (%s, %s)"
data = [("小明", 20), ("小红", 22), ("小张", 24)]
cursor.executemany(sql, data)
conn.commit()
print("批量插入成功!")

5.2 批量删除

python复制编辑sql = "DELETE FROM users WHERE name = %s"
data = [("小明",), ("小红",)]
cursor.executemany(sql, data)
conn.commit()
print("批量删除成功!")

6. 异常处理

python复制编辑import mysql.connector

try:
    conn = mysql.connector.connect(
        host="localhost",
        user="root",
        password="wrong_password",
        database="test_db"
    )
except mysql.connector.Error as err:
    print("错误:", err)
finally:
    if conn.is_connected():
        conn.close()

7. 存储过程

存储过程是预定义的 SQL 代码块,可提高性能。

7.1 创建存储过程

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

7.2 Python 调用存储过程

cursor.callproc("GetAllUsers")

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

解说:

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

8. 触发器

8.1 创建触发器

sql复制编辑DELIMITER //
CREATE TRIGGER before_insert_users
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
    SET NEW.name = UPPER(NEW.name);
END //
DELIMITER ;

8.2 Python 插入数据

python复制编辑cursor.execute("INSERT INTO users (name, age) VALUES ('zhangsan', 25)")
conn.commit()

(插入的数据 zhangsan 会变为 ZHANGSAN


9. 性能优化

9.1 使用 buffered=True

cursor = conn.cursor(buffered=True)

解说:

  • 避免 Unread result found 错误,适用于需要多次查询的情况。

9.2 开启 autocommit

conn.autocommit = True

解说:

  • 适用于查询密集型应用,减少 commit() 开销。

9.3 使用索引

CREATE INDEX idx_name ON users(name);

解说:

  • 索引加速查询 WHERE name='xxx' 的匹配速度。

10. 连接池

mysql-connector-python 支持 连接池,减少频繁创建连接的开销。

from mysql.connector import pooling

pool = pooling.MySQLConnectionPool(
    pool_name="mypool",
    pool_size=5,
    host="localhost",
    user="root",
    password="123456",
    database="test_db"
)

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

解说:

  • pool_size=5 允许同时创建 5 个数据库连接,提高性能。

11. 关闭连接

cursor.close()
conn.close()

解说:

  • 必须关闭连接,避免资源占用问题。

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

发表回复 0

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