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

数据库 - python操作MySQL

目录

前言

一、PyMySQL的特点

二、安装

三、基本用法

(一)连接MySQL数据库

(二)数据查询

(三)插入数据

(四)更新和删除数据

(五)事务管理

四、游标类型

五、安全性

六、常见错误处理

七、性能优化

八、总结


前言

PyMySQL 是一个纯 Python 的库,用于连接 MySQL 数据库,并执行 SQL 语句。它是 MySQLdb 的替代品,但不同于后者,PyMySQL 不需要 C 语言的依赖,因此更加轻量且易于安装和使用。该库的主要用途是通过 Python 代码与 MySQL 数据库进行交互,比如执行查询、插入数据、更新数据、删除数据等操作。


一、PyMySQL的特点

该库的特点主要有以下三点:

  • 纯 Python 实现:不需要依赖 C 扩展库,可以轻松在各类系统上使用,如 Windows、Linux、macOS 等。

  • 兼容性强:支持 MySQL 5.x 和 MySQL 8.x 版本,也兼容 MariaDB。

  • 易用性:提供了与 MySQLdb 类似的 API,便于用户从 MySQLdb 迁移过来。


二、安装

PyMySQL 可以通过 pip 轻松安装:

pip install pymysql

三、基本用法

(一)连接MySQL数据库

在使用 PyMySQL 之前,你需要先连接到 MySQL 数据库。连接数据库时,通常需要提供数据库的主机地址、用户名、密码、数据库名等信息。

示例:

import pymysql# 创建连接
connection = pymysql.connect(host='localhost',      # 数据库主机地址user='your_username',  # 数据库用户名password='your_password', # 数据库密码database='your_dbname',   # 选择的数据库charset='utf8mb4',     # 指定字符集cursorclass=pymysql.cursors.DictCursor  # 返回字典格式的数据
)# 创建游标
cursor = connection.cursor()# 关闭游标和连接
cursor.close()
connection.close()

(二)数据查询

使用游标对象来执行 SQL 查询并获取数据。

示例:

try:# 创建游标with connection.cursor() as cursor:# SQL 查询sql = "SELECT * FROM users WHERE age > %s"cursor.execute(sql, (25,))  # 使用参数化查询防止 SQL 注入# 获取结果results = cursor.fetchall()  # 返回所有结果for row in results:print(row)
finally:# 关闭连接connection.close()

(三)插入数据

执行插入操作时,可以使用 execute()executemany() 方法。

示例:

try:with connection.cursor() as cursor:# SQL 插入语句sql = "INSERT INTO users (name, age, email) VALUES (%s, %s, %s)"# 执行单条插入cursor.execute(sql, ('John Doe', 30, 'john.doe@example.com'))# 执行多条插入users = [('Alice', 25, 'alice@example.com'),('Bob', 28, 'bob@example.com')]cursor.executemany(sql, users)# 提交更改connection.commit()
finally:connection.close()

(四)更新和删除数据

类似于插入数据,更新和删除数都是通过 SQL 语句和 execute() 函数来完成。

  • 更新数据

示例:

try:with connection.cursor() as cursor:# SQL 更新语句sql = "UPDATE users SET email = %s WHERE name = %s"cursor.execute(sql, ('new.email@example.com', 'John Doe'))# 提交更改connection.commit()
finally:connection.close()
  • 删除数据

示例:

try:with connection.cursor() as cursor:# SQL 删除语句sql = "DELETE FROM users WHERE name = %s"cursor.execute(sql, ('John Doe',))# 提交更改connection.commit()
finally:connection.close()

(五)事务管理

MySQL 数据库支持事务,PyMySQL 默认启用了自动提交。如果你需要手动控制事务,可以关闭自动提交并在合适的时机提交或回滚。

示例:

try:# 关闭自动提交connection.autocommit(False)with connection.cursor() as cursor:# SQL 插入语句sql = "INSERT INTO users (name, age, email) VALUES (%s, %s, %s)"cursor.execute(sql, ('Chris', 27, 'chris@example.com'))# 人为错误,测试回滚raise Exception("人为触发异常")# 提交事务connection.commit()
except Exception as e:print(f"出现错误: {e}")# 回滚事务connection.rollback()
finally:connection.close()

四、游标类型

PyMySQL 提供了多种游标类型,适用于不同的场景:

  • 默认游标:返回元组格式的结果。

  • 字典游标 (DictCursor):返回字典格式的结果,字段名作为键。

  • SSCursor:流式游标,用于处理大数据量时,避免一次性加载大量数据到内存。

使用不同游标类型可以通过 cursorclass 参数指定。例如:

# 字典游标
connection = pymysql.connect(host='localhost',user='your_username',password='your_password',database='your_dbname',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor  # 使用字典游标
)

五、安全性

为了防止 SQL 注入攻击,务必使用参数化查询,而不是将参数直接拼接到 SQL 字符串中。

示例:

# 不安全的写法
sql = f"SELECT * FROM users WHERE name = '{name}'"  # 容易导致 SQL 注入# 安全的写法
sql = "SELECT * FROM users WHERE name = %s"
cursor.execute(sql, (name,))

六、常见错误处理

PyMySQL 中常见的错误处理可以通过捕获异常来完成:

import pymysqltry:connection = pymysql.connect(host='localhost', user='root', password='', database='test_db')cursor = connection.cursor()
except pymysql.MySQLError as e:print(f"数据库连接失败: {e}")

七、性能优化

  • 使用批量操作:如插入数据时,使用 executemany() 批量插入,减少数据库的交互次数。

  • 连接池:在大规模应用中,可以通过第三方库如 DBUtilsSQLAlchemy 提供的连接池来优化数据库连接的复用性。

  • 流式查询:对于大规模查询,使用 SSCursor 流式游标,避免一次性加载所有数据到内存。


八、总结

PyMySQL 是一个轻量级、易于使用的 Python 库,适合 Python 程序员与 MySQL 数据库进行交互。通过它,你可以高效地执行 SQL 查询、插入、更新和删除数据操作,同时还可以利用其事务支持、游标控制等高级功能。

相关文章:

  • 【C语言】tcp接收服务
  • 使用 Spring Boot 实现 JWT 生成与验证的自定义类
  • Library介绍(三)
  • 二叉搜索树(c++版)
  • Qt多线程与数据库
  • MacOS升级Ruby版本详解:步骤、挑战与解决方案
  • 深度学习推理的技术实现与优化策略
  • ELK-03-skywalking监控linux系统
  • 新能源汽车储充机器人:能源高效与智能调度
  • STM32常见配置
  • LM393 电压比较器和典型电路
  • Ubuntu 镜像替换为阿里云镜像:简化你的下载体验
  • JavaScript 网页设计案例:打造一个交互式用户界面
  • 迈瑞嵌入式面试及参考答案
  • 软件测试学习笔记丨Mock的价值与实战
  • Angular数据绑定机制
  • Javascript 原型链
  • Java的Interrupt与线程中断
  • JS基础之数据类型、对象、原型、原型链、继承
  • js数组之filter
  • Python_OOP
  • Sequelize 中文文档 v4 - Getting started - 入门
  • springboot_database项目介绍
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue2.x学习三:事件处理生命周期钩子
  • 百度小程序遇到的问题
  • 工作中总结前端开发流程--vue项目
  • 前端面试题总结
  • 时间复杂度与空间复杂度分析
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 思维导图—你不知道的JavaScript中卷
  • 正则表达式小结
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​如何防止网络攻击?
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (多级缓存)多级缓存
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net core 外观者设计模式 实现,多种支付选择
  • .Net Core 中间件验签
  • .NET 材料检测系统崩溃分析
  • .NET 常见的偏门问题
  • .NET下ASPX编程的几个小问题
  • .NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [<MySQL优化总结>]
  • [240527] 谷歌 CEO 承认 AI 编造虚假信息问题难解(此文使用 @gemini 命令二次创作)| ICQ 停止运作