Python MySQL – mysql-connector 驱动详解
在 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)。user和password需要与 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()
✅ 解说:
- 必须关闭连接,避免资源占用问题。
更多详细内容请关注其他相关文章!