当前位置: 首页 > news >正文

Python 操作MySQL数据库

目录

Python连接MySQL

1. 概述

2. 核心作用

3. 核心流程(以 PyMySQL 为例)

4. 重点总结

5. 典型应用场景

一、安装 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 UNCOMMITTED (未提交读)

(2)READ COMMITTED(提交读)

(3)REPEATABLE READ(可重复读)

(4)SERIAIZABLE (串行化)

核心对比(隔离级别与问题):

5. 事务隔离级别总结

6. 案例


Python连接MySQL

1. 概述

Python 通过数据库驱动或 ORM 工具与 MySQL 交互,支持数据存储、查询和管理。常用库包括:

  • 原生驱动mysql-connector-python(官方)、PyMySQL(纯Python)。

  • ORM 框架SQLAlchemy(通用)、Django ORM(Django 专属)。

2. 核心作用
  • 数据持久化:存储用户信息、日志、交易记录等。

  • 动态查询:支持条件检索、聚合统计、多表关联等操作。

  • 事务管理:确保数据操作的原子性(如转账操作)。

  • 应用开发:为 Web、数据分析、自动化工具提供数据支持。

3. 核心流程(以 PyMySQL 为例)
  1. 连接数据库:配置主机、用户、密码、数据库名。

  2. 创建游标:通过游标执行 SQL 命令。

  3. 执行 SQL:查询(SELECT)、增删改(INSERT/UPDATE/DELETE)。

  4. 处理结果:获取数据或提交事务。

  5. 关闭连接:释放资源,避免泄漏。

4. 重点总结
关键点说明
驱动选择根据需求选库:快速开发用 ORM,高性能用原生驱动。
参数化查询使用 %s 占位符,避免 SQL 注入攻击。
事务管理写操作后需 commit(),异常时 rollback() 保证数据一致性。
资源释放使用 with 语句或手动关闭连接,防止资源泄漏。
ORM 优势用类操作表(如 User.query.filter_by(name='Alice')),简化 SQL 编写。
连接池优化高并发场景使用连接池(如 DBUtils),提升性能。

5. 典型应用场景
  • Web 后端:Django/Flask 集成 ORM 处理用户数据。

  • 数据分析pandas 从 MySQL 读取数据进行分析。

  • 自动化脚本:定时备份、数据迁移(如 mysqldump + Python 处理)。

一、安装 Python MySQL 连接库

1. 安装mysql-connector-python

pip3 install mysql-connector-python

2. 安装PyMySQL

pip3 install pymysql

二、 Python 连接MySQL 数据库

1. 导入连接库

创建文件 aaa.py(导入模块)
import pymysql

2. 创建数据库连接

#连接名字+值()
db=pymysql.connect(host="192.168.10.101",    #MySQL数据库的地址,通常是localhsot或IP地址user="root",        #数据库的用户名,通常是rootpassword="pwd123",    #数据库的密码database="testdb"    #要连接的数据库名称
)	##要注意远程必须可以连接到MySQL服务器的,在服务器上创建用于远程用户并授权
例如:create user 'root'@'%' identified by 'pwd123';grant all on *.* to 'root'@'%';flush privileges;

3. 创建游标对象

#建立连接(游标:cursor,动态变化位置)
cursor=db.cursor()			#针对上面的值 建立游标用于连接

4. 执行SQL语句

#执行SQL语句,可以使用%s占位符来避免SQL注入攻击
cursor.execute("select * from users")

5. 获取查询结果

#定义执行结果为它赋值
results=cursor.fetchall()
for row in results:print(row)

6. 关闭连接

#关闭连接(执行完成后要关闭游标和数据库连接)
cursor.close()
db.close()

三、常见的MySQL操作

1. 插入数据(INSERT)

cursor.execute("insert into users (name,age) values(%s,%s)",("zhangsan",20))
db.commit()    --提交事务

2. 更新数据(UPDATE)

cursor.execute("UPDATE users SET age = %s WHERE name = %s , (26,"ALice")")
db.commit()  #提交

3.删除数据(DELETE)

cursor.execute("DELETE FROM users WHERE name = %s",("Alice",))
db.commit()      #提交事务

4. 查询数据(SELECT)

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

5. 执行多条SQL语句

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

6. 使用LIKE进行模糊查询

作用:根据模式匹配检索数据,支持通配符 %(任意字符)和 _(单个字符)。

cursor.execute("select * from users where name like %s",("zhang%"))
results = cursor.fetchall()
for row in results:print(row)

7. 使用JOIN 进行联合查询

作用:联合多表数据,常用类型:

  • INNER JOIN:返回两表匹配的行。

  • LEFT JOIN:返回左表所有行,右表无匹配则为 NULL

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

代码解析:

  • SQL 查询:使用 INNER JOIN 连接 users 和 orders 表,通过 user_id 关联,查询用户姓名(users.name)和订单金额(orders.amount)。
  • Python 操作
    • cursor.execute() 执行 SQL 语句。
    • fetchall() 获取所有查询结果。
    • 遍历结果并打印每行数据(用户姓名与对应订单金额的组合)。

四、使用连接池

1. 连接池简介

  • 作用:预先创建并管理多个数据库连接,避免频繁创建/关闭连接的开销。

  • 优势:提升性能、控制并发连接数、防止资源耗尽。

2. 创建连接池

先安装库用来建立来连接池

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. 连接池的优势

  • 资源复用:避免重复创建连接,减少 TCP 握手和认证开销。

  • 流量控制:限制最大连接数,防止数据库过载。

  • 健康检查:自动检测失效连接并重建。

五、事务管理

1. 开始事务

cursor.execute("START TRANSACTION")

2. 提交事务

db.commit()

3. 回滚事务

db.rollback()

4. 事务的隔离级别

(1)READ UNCOMMITTED (未提交读)
  • 描述:事务可读取其他事务未提交的数据,可能导致 脏读(Dirty Read),事务间隔离性最差。
  • 应用场景:通常不推荐使用,除非对数据一致性要求极低。
  • 使用方法
    cursor.execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")
(2)READ COMMITTED(提交读)
  • 描述:事务仅读取其他事务已提交的数据,避免脏读,但可能出现 不可重复读(Non-repeatable Read)(同一事务内多次读取同一数据,值因其他事务提交而变化)。
  • 应用场景:适用于多数常见场景,平衡隔离性与性能(如普通业务查询)。
  • 使用方法
    cursor.execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED")
(3)REPEATABLE READ(可重复读)
    • 描述:事务内多次读取同一数据,值保持不变(避免不可重复读),但可能出现 幻读(Phantom Read)(同一事务内查询结果集因其他事务插入 / 删除而变化)。
    • 应用场景:需保证事务内数据一致性(如金融系统余额操作、订单状态变更)。
    • 使用方法
      cursor.execute("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ")
      
(4)SERIAIZABLE (串行化)
  • 描述:最严格隔离级别,事务串行执行(完全避免脏读、不可重复读、幻读),但 性能开销大(锁竞争剧烈)。
  • 应用场景:对数据一致性要求极高(如库存管理、银行转账、关键业务交易)。
  • 使用方法
    cursor.execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE")

核心对比(隔离级别与问题):

隔离级别脏读不可重复读幻读隔离性性能
READ UNCOMMITTED✔️✔️✔️最低最高
READ COMMITTED✔️✔️中等中等
REPEATABLE READ✔️较高中等
SERIALIZABLE最高最低

5. 事务隔离级别总结

  • READ UNCOMMITTED:允许脏读,最低隔离级别,性能最好,但容易出现数据不一致的情况。
  • READ COMMITTED:解决了脏读问题,但可能出现不可重复读。
  • REPEATABLE READ:解决了脏读和不可重复读问题,但可能出现幻读。(MySQL事务默认级别)
  • SERIALIZABLE:解决了所有问题,但性能最差,可能导致事务时间等待。

注意:在选择隔离级别是,需根据具体需求平衡数据一致性和性能,如果事务数据不频繁冲突,可以选择较低的隔离级别以提高性能,而对数据一致性要求高的场景,则选择更高的隔离级别。

6. 案例

import pymysql# 连接到数据库
conn = pymysql.connect(host='localhost',user='root',password='password',database='testdb'
)# 创建一个游标对象
cursor = conn.cursor()# 关闭自动提交模式
conn.autocommit = Falsetry:# 开始事务# 执行插入操作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()

相关文章:

  • 每日leetcode(昨天赶飞机没做,今天补)
  • Java序列化与反序列化详细介绍
  • QT写槽函数的注意事项
  • js实现音频的录制
  • LangGraph-agent-天气助手
  • 地下综合管廊 3D 可视化平台
  • 微信小程序数据接收
  • uniapp-商城-67-shop(3-品牌信息显示,弹窗显示完整品牌信息,弹窗拨打电话、地图定位)
  • 安卓11 不带谷歌包默认桌面布局
  • HarmonyOS赋能套件介绍
  • 聊一聊手动测试与探索性测试的区别
  • mysql统计数据库大小
  • 从Embedding到多模态检索:AI知识库构建的进阶路线图
  • 2021-10-28 C++判断完全平方数
  • 学习STC51单片机14(芯片为STC89C52RC)
  • 点云补全技术深度解析:从原理到实践
  • JWT生成的token的构成部分
  • 5.Java 面向对象编程入门:类与对象的创建和使用​
  • 【C++】深入理解C++中的函数与运算符重载
  • Android中获取控件尺寸进阶方案
  • 国外的服务器网站/深圳百度搜索排名优化
  • 河南省建设部官方网站/seo诊断服务
  • 建设电商网站/如何在百度发广告推广
  • 网站运营专员做六休一/seo优化推广
  • 企业局域网组建与网站建设/seo运营做什么
  • 北京建设部网站官网/网站seo属于什么专业