目录
一:安装python MySQL连接库
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.事务的隔离级别
(1)READ UNCONNITTED (未提交读)
(2)READ COMMITTED (提交读)
(3)REPEATABLE READ (可重复读)
(4)SERIALIZABLE (串行化)
(5)隔离级别总结
6.案例
pip install mysql-connector-python
pip install pymysql
首先,我们需要导入 pymysql 模块,使用它来连接 MySQL 数据库并执行 SQL 语句。
import pymysql
我们使用 pymysql.connect () 方法来建立数据库连接。连接时需要提供 MySQL 服务器的地址、用户名、密码和要访问的数据库名。
db = pymysql.connect(
host="localhost", # MySQL数据库地址,localhost表示本地
user="root", # 数据库用户名,常见为root
password="password", # 数据库密码
database="testdb" # 要连接的数据库名
)
建立连接后,我们需要创建一个游标对象,通过它来执行SQL语句。
cursor = db.cursor()
通过游标对象的 execute () 方法,我们可以执行 SQL 语句。在执行 SQL 时,可以使用 % s 占位符来避免 SQL 注入攻击。
cursor.execute("SELECT * FROM users")
对于查询操作,fetchall () 方法用于获取所有结果,fetchone () 方法用于获取单条记录。
results = cursor.fetchall()
for row in results:
print(row)
操作完成后,记得关闭游标和数据库连接。
cursor.close()
db.close()
插入数据时,我们使用 INSERT INTO 语句,通过 execute () 方法执行插入操作。为了防止 SQL 注入攻击,插入语句中的值应使用 % s 占位符。
cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Alice", 25))
db.commit() # 提交事务,保存插入的数据
更新数据时,我们使用 UPDATE 语句,通过 execute () 方法执行。通常我们会添加 WHERE 条件,以确保只更新需要更新的记录。
cursor.execute("UPDATE users SET age = %s WHERE name = %s", (26, "Alice"))
db.commit() # 提交事务,保存更新的数据
删除数据时,我们使用 DELETE 语句,并通过 WHERE 条件确保删除特定记录。
cursor.execute("DELETE FROM users WHERE name = %s", ("Alice",))
db.commit() # 提交事务,保存删除的数据
查询数据时,使用 SELECT 语句。你可以使用 fetchall () 获取所有记录,或使用 fetchone () 获取一条记录。
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
for row in results:
print(row)
对于批量插入、更新等操作,可以使用 executemany () 方法一次执行多条 SQL 语句。
cursor.executemany(
"INSERT INTO users (name, age) VALUES (%s, %s)",
[("Bob", 30), ("Charlie", 35), ("David", 28)]
)
db.commit() # 提交事务
LIKE 关键字允许你进行模糊查询。你可以使用 % 通配符来匹配任意字符。
cursor.execute("SELECT * FROM users WHERE name LIKE %s", ("%a%",))
results = cursor.fetchall()
for row in results:
print(row)
在多个表之间建立关系时,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)
连接池技术能够在高并发场景下提升数据库连接的效率。在连接池中,多个数据库连接被提前创建并放入池中,客户端通过池获取连接,而不是每次都建立新的连接。这大大减少了连接创建和销毁的开销。
PyMySQL 并不直接支持连接池,但我们可以使用 DBUtils 库来创建连接池。首先需要安装 DBUtils:
pip3 install dbutils
import pymysql
from dbutils.pooled_db import PooledDB
dbconfig = {
"host": "local",
"user": "root",
"password": "password",
"database": "testdb"
}
#创建连接池
connection_pool = PooledDB (
creator=pymysql, # 使用 PyMySQL 作为数据库连接库
maxconnections=5, # 连接池中最大连接数
**dbconfig
)
从连接池中获取连接时,可以使用 connection () 方法。每次获取到的连接都可以直接执行数据库操作。
b_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() # 连接会自动归还给连接池
事务是由多个 SQL 语句组成的一个工作单元。事务保证了数据的原子性,即所有操作要么都成功,要么都失败。
事务可以通过 START TRANSACTION 来显式开启,但一般我们通过执行 SQL 语句来启动事务。
cursor.execute("START TRANSACTION")
如果事务中的所有操作都成功,我们使用 commit () 方法提交事务,保存对数据库的更改。
db.commit()
如果事务中的某些操作失败,我们可以使用 rollback () 方法回滚事务,将所有更改撤销。
db.commit()
MySQL 支持四种事务隔离级别,它们定义了在并发事务执行时一个事务的操作对于其他事务的影响。
隔离级别的设置越高,事务间的干扰越小,但同时可能导致性能下降。MySQL 的默认隔离级别是 REPEATABLE READ,具体如下:
cursor.execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")
cursor.execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED")
cursor.execute("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ")
cursor.execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE")
在选择事务隔离级别时,需要根据应用的具体需求平衡数据一致性和性能。如果事务数据不频繁冲突,可以选择较低的隔离级别以提升性能;而对于数据一致性要求极高的场景,则应选择更高的隔离级别,尽管这会带来性能上的损失。
在 MySQL 中,事务的默认隔离级别是 REPEATABLE READ
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()