Python操作MySQL数据库

发布于:2025-06-20 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

一:安装PythonMySQL连接库

1:安装mysql-connector-python

2.安装 PyMySQL(作为替代)

二:Python连接MySQL数据库

1.导入连接库

2.创建数据库连接

3.创建游标对象

4.执行 SQL 语句

5.获取查询结果

6.关闭连接

三:常见的 MySQL 操作

1.插入数据 (INSERT)

2.更新数据 (UPDATE)

3.删除数据 (DELETE)

4.查询数据 (SELECT)

5.执行多条 SQL 语句

6.使用 LIKE 进行模糊查询

7.使用 JOIN 进行联合查询

四:使用连接池

1.连接池简介

2.创建连接池

3.获取连接

4.连接池的优势

五:事务管理

1.开始事务

2.提交事务

3. 回滚事务

4.事务的隔离级别

5.事务隔离级别总结

6.案例


一:安装PythonMySQL连接库

    在开始之前,我们需要安装 Python的 MySQL连接库。mysq1-connector-python是一个官方推荐的库,用于与MySQL数据库进行交互。如果你更习惯使用其他库,PyMySQL也,可以作为替代方案。

1:安装mysql-connector-python

pip install mysql-connector-python

2.安装 PyMySQL(作为替代)

pip install pymsql

二:Python连接MySQL数据库

1.导入连接库

首先,我们需要导入 pymysql 模块,使用它来连接 MySQL 数据库并执行 SQL 语句:

import pymysql

2.创建数据库连接

我们使用 pymysql.connect() 方法来建立数据库连接,连接时需要提供 MySQL 服务器的地址、用户名、密码和要访问的数据库名。

db = pymysql.connect(
    host="localhost",     # MySQL 数据库的地址,通常是 localhost或 IP 地址
    user="root",          # 数据库的用户名,通常是 root
    password="password",  # 数据库的密码
    database="testdb"     # 要连接的数据库名称
)

3.创建游标对象

建立连接后,我们需要创建一个游标对象,通过它来执行 SQL 语句。

ursor = db.cursor()

4.执行 SQL 语句

通过游标对象的 execute() 方法,我们可以执行 SQL 语句。在执行 SQL 时,可以使用 %s 占位符来避免 SQL 注入攻击。

cursor.execute("SELECT * FROM users")

5.获取查询结果

对于查询操作,fetchall() 方法用于获取所有结果,fetchone() 方法用于获取单条记录。

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

6.关闭连接

操作完成后,记得关闭游标和数据库连接。

cursor.close()
db.close()

三:常见的 MySQL 操作

1.插入数据 (INSERT)

插入数据时,我们使用 INSERT INTO 语句,通过 execute () 方法执行插入操作。为了防止 SQL 注入攻击,插入语句中的值应使用 % s 占位符。

cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Alice", 25))
db.commit()  # 提交事务,保存插入的数据

2.更新数据 (UPDATE)

更新数据时,我们使用 UPDATE 语句,通过 execute () 方法执行。通常我们会添加 WHERE 条件,以确保只更新需要更新的记录。

cursor.execute("UPDATE users SET age = %s WHERE name = %s", (26, "Alice"))
db.commit()  # 提交事务,保存更新的数据

3.删除数据 (DELETE)

删除数据时,我们使用 DELETE 语句,并通过 WHERE 条件确保删除特定记录。

cursor.execute("DELETE FROM users WHERE name = %s", ("Alice",))
db.commit()  # 提交事务,保存删除的数据

4.查询数据 (SELECT)

查询数据时,使用 SELECT 语句。你可以使用 fetchall () 获取所有记录,或使用 fetchone () 获取一条记录。

cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
for row in results:
    print(row)

5.执行多条 SQL 语句

对于批量插入、更新等操作,可以使用 executemany () 方法一次执行多条 SQL 语句。

cursor.executemany(
    "INSERT INTO users (name, age) VALUES (%s, %s)",
    [("Bob", 30), ("Charlie", 35), ("David", 28)]
)
 
db.commit()  # 提交事务

6.使用 LIKE 进行模糊查询

LIKE 关键字允许你进行模糊查询。你可以使用 % 通配符来匹配任意字符。

cursor.execute("SELECT * FROM users WHERE name LIKE %s", ("%a%",))
results = cursor.fetchall()
for row in results:
    print(row)

7.使用 JOIN 进行联合查询

在多个表之间建立关系时,JOIN 关键字用于合并多个表的数据。

cursor.execute ("""
SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id
""")
results = cursor.fetchall ()
for row in results:
print (row)

四:使用连接池

1.连接池简介

连接池技术能够在高并发场景下提升数据库连接的效率。在连接池中,多个数据库连接被提前创建并放入池中,客户端通过池获取连接,而不是每次都建立新的连接。这大大减少了连接创建和销毁的开销。

2.创建连接池

PyMySQL 并不直接支持连接池,但我们可以使用 DBUtils 库来创建连接池。首先需要安装 DBUtils:

pip install dbutils
 
from dbutils.pooled_db import PooledDB
import pymysql
 
# 数据库连接配置
dbconfig = {
    "host": "localhost",
    "user": "root",
    "password": "password",
    "database": "testdb"
}
 
# 创建连接池
connection_pool = PooledDB(
    creator=pymysql,  # 使用 PyMySQL 作为数据库连接库
    maxconnections=5,  # 连接池中最大连接数
    **dbconfig
)

3.获取连接

从连接池中获取连接时,可以使用 connection () 方法。每次获取到的连接都可以直接执行数据库操作。

db_connection = connection_pool.connection()
cursor = db_connection.cursor()
 
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
 
for row in results:
    print(row)
 
cursor.close()
db_connection.close()  # 连接会自动归还给连接池

4.连接池的优势

优势分类 具体说明
性能提升 减少每次数据库操作创建新连接的开销,提升数据库操作效率
资源管理 限制最大连接数,避免过多连接致数据库过载
更易管理 统一管理连接生命周期,简化代码结构

五:事务管理

事务是由多个 SQL 语句组成的一个工作单元。事务保证了数据的原子性,即所有操作要么都成功,要么都失败。

1.开始事务

事务可以通过 START TRANSACTION 来显式开启,但一般我们通过执行 SQL 语句来启动事务。

cursor.execute("START TRANSACTION")

2.提交事务

如果事务中的所有操作都成功,我们使用 commit () 方法提交事务,保存对数据库的更改。

db.commit()

3. 回滚事务

如果事务中的某些操作失败,我们可以使用 rollback () 方法回滚事务,将所有更改撤销。

db.rollback()

4.事务的隔离级别

MySQL 支持四种事务隔离级别,它们定义了在并发事务执行时一个事务的操作对于其他事务的影响。隔离级别的设置越高,事务间的干扰越小,但同时可能导致性能下降。MySQL 的默认隔离级别是 REPEATABLE READ,具体如下:

隔离级别 描述 问题/现象 应用场景 使用方法
READ UNCOMMITTED(未提交读) 事务可以读取其他事务未提交的数据。 脏读(Dirty Read) 对数据一致性要求不高的场景,通常不推荐使用。 cursor.execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")
READ COMMITTED(提交读) 事务只能读取其他事务已提交的数据。 不可重复读(Non-repeatable Read) 大多数常见场景,提供一定的隔离性且性能较好。 cursor.execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED")
REPEATABLE READ(可重复读) 事务内多次读取同一数据时,其值不会变化。 幻读(Phantom Read) 需要保证数据一致性的场景(如金融系统)。 cursor.execute("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ")
SERIALIZABLE(串行化) 最高隔离级别,事务串行执行,完全避免脏读、不可重复读和幻读。 无并发问题,但性能最低。 严格要求数据一致且并发冲突高的场景(如银行交易、库存管理)。 cursor.execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE")

5.事务隔离级别总结

隔离级别 解决的问题 仍存在的问题 性能特点 适用场景
READ UNCOMMITTED 脏读 性能最好 对数据一致性要求极低,允许脏读的场景(极少使用)。
READ COMMITTED 脏读 不可重复读 性能较好 大多数常见应用,允许不可重复读但需避免脏读的场景。
REPEATABLE READ 脏读、不可重复读 幻读 性能中等(MySQL默认) 需要保证事务内数据一致性的场景(如金融系统)。
SERIALIZABLE 脏读、不可重复读、幻读 性能最差 严格要求数据一致性且并发冲突高的场景(如银行交易、库存管理)。
  1. 默认隔离级别:MySQL 默认为 REPEATABLE READ

  2. 选择建议

    • 低冲突场景:优先选择 READ COMMITTED 或 REPEATABLE READ 以平衡性能与一致性。

    • 高一致性需求:选择 SERIALIZABLE,但需接受性能损失。

  3. 幻读:仅 SERIALIZABLE 能彻底解决,其他级别需通过锁或乐观锁等额外机制处理。

6.案例

import pymysql
 
# 连接到数据库
conn = pymysql.connect(
    host='localhost',
    user='root',
    password='password',
    database='testdb'
)
 
# 创建一个游标对象
cursor = conn.cursor()
 
# 关闭自动提交模式
conn.autocommit = False
try:
    # 开始事务
 
    # 执行插入操作
    cursor.execute("INSERT INTO users (name, age) VALUES ('Eve', 22)")
    cursor.execute("INSERT INTO orders (user_id, amount) VALUES ((SELECT id FROM users WHERE name = 'Eve'), 120.50)")
 
    # 提交事务
    conn.commit()
    print("事务已提交。")
 
except pymysql.MySQLError as err:
    # 如果发生错误,回滚事务
    print(f"错误: {err}")
    conn.rollback()
    print("事务已回滚。")
 
finally:
    # 关闭游标和连接
    cursor.close()
    conn.close()


网站公告

今日签到

点亮在社区的每一天
去签到