Python使用PyMySQL操作MySQL完整指南
Python使用PyMySQL操作MySQL完整指南
1. 安装依赖
pip install pymysql
2. 基础配置和数据库操作
2.1 基础配置类
import pymysql
from typing import List, Dict, Optional
from datetime import datetimeclass MySQLDB:def __init__(self):self.conn = Noneself.cursor = Nonedef connect(self):"""连接数据库"""try:self.conn = pymysql.connect(host='localhost',port=3306,user='root',password='123456',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor # 返回字典格式)self.cursor = self.conn.cursor()except Exception as e:print(f"连接数据库失败:{e}")raise edef close(self):"""关闭数据库连接"""if self.cursor:self.cursor.close()if self.conn:self.conn.close()
2.2 数据库和表操作
def create_database(self):"""创建数据库"""try:sql = "CREATE DATABASE IF NOT EXISTS test DEFAULT CHARACTER SET utf8mb4"self.cursor.execute(sql)self.conn.select_db('test') # 选择数据库except Exception as e:print(f"创建数据库失败:{e}")raise edef drop_database(self):"""删除数据库"""try:sql = "DROP DATABASE IF EXISTS test"self.cursor.execute(sql)except Exception as e:print(f"删除数据库失败:{e}")raise edef create_table(self):"""创建用户表"""try:sql = """CREATE TABLE IF NOT EXISTS users (id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',password VARCHAR(100) NOT NULL COMMENT '密码',age INT COMMENT '年龄',create_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',INDEX idx_username (username)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';"""self.cursor.execute(sql)self.conn.commit()except Exception as e:self.conn.rollback()print(f"创建表失败:{e}")raise e
3. CRUD操作
3.1 插入操作
def insert_user(self, username: str, password: str, age: int) -> int:"""插入单个用户"""try:sql = "INSERT INTO users(username, password, age) VALUES (%s, %s, %s)"self.cursor.execute(sql, (username, password, age))self.conn.commit()return self.cursor.lastrowid # 返回自增IDexcept Exception as e:self.conn.rollback()print(f"插入用户失败:{e}")raise edef batch_insert_users(self, users: List[Dict]):"""批量插入用户"""try:sql = "INSERT INTO users(username, password, age) VALUES (%s, %s, %s)"values = [(user['username'], user['password'], user['age']) for user in users]self.cursor.executemany(sql, values)self.conn.commit()except Exception as e:self.conn.rollback()print(f"批量插入用户失败:{e}")raise e
3.2 查询操作
def get_user_by_id(self, user_id: int) -> Optional[Dict]:"""根据ID查询用户"""try:sql = "SELECT * FROM users WHERE id = %s"self.cursor.execute(sql, (user_id,))return self.cursor.fetchone()except Exception as e:print(f"查询用户失败:{e}")raise edef get_users_by_age(self, min_age: int) -> List[Dict]:"""查询大于指定年龄的用户"""try:sql = "SELECT * FROM users WHERE age > %s"self.cursor.execute(sql, (min_age,))return self.cursor.fetchall()except Exception as e:print(f"查询用户失败:{e}")raise edef get_users_with_pagination(self, page: int, page_size: int) -> List[Dict]:"""分页查询用户"""try:offset = (page - 1) * page_sizesql = "SELECT * FROM users LIMIT %s OFFSET %s"self.cursor.execute(sql, (page_size, offset))return self.cursor.fetchall()except Exception as e:print(f"分页查询失败:{e}")raise e
3.3 更新操作
def update_user(self, user_id: int, password: str = None, age: int = None) -> bool:"""更新用户信息"""try:updates = []values = []if password is not None:updates.append("password = %s")values.append(password)if age is not None:updates.append("age = %s")values.append(age)if not updates:return Falsevalues.append(user_id)sql = f"UPDATE users SET {', '.join(updates)} WHERE id = %s"result = self.cursor.execute(sql, tuple(values))self.conn.commit()return result > 0except Exception as e:self.conn.rollback()print(f"更新用户失败:{e}")raise e
3.4 删除操作
def delete_user(self, user_id: int) -> bool:"""删除用户"""try:sql = "DELETE FROM users WHERE id = %s"result = self.cursor.execute(sql, (user_id,))self.conn.commit()return result > 0except Exception as e:self.conn.rollback()print(f"删除用户失败:{e}")raise e
4. 使用示例
def main():# 创建数据库实例db = MySQLDB()try:# 连接数据库db.connect()# 创建数据库和表db.create_database()db.create_table()# 插入单个用户user_id = db.insert_user("张三", "123456", 25)print(f"插入用户ID: {user_id}")# 批量插入用户users = [{"username": "李四", "password": "123456", "age": 26},{"username": "王五", "password": "123456", "age": 27}]db.batch_insert_users(users)# 查询用户user = db.get_user_by_id(user_id)print(f"查询到的用户: {user}")# 更新用户db.update_user(user_id, age=30)# 分页查询users = db.get_users_with_pagination(1, 10)print(f"分页查询结果: {users}")# 删除用户db.delete_user(user_id)except Exception as e:print(f"操作失败:{e}")finally:db.close()if __name__ == "__main__":main()
5. 事务处理示例
def transfer_money(self, from_id: int, to_id: int, amount: float):"""转账操作示例"""try:# 开始事务self.conn.begin()# 扣除转出账户金额sql1 = "UPDATE accounts SET balance = balance - %s WHERE id = %s AND balance >= %s"result1 = self.cursor.execute(sql1, (amount, from_id, amount))if result1 == 0:raise Exception("余额不足或账户不存在")# 增加转入账户金额sql2 = "UPDATE accounts SET balance = balance + %s WHERE id = %s"result2 = self.cursor.execute(sql2, (amount, to_id))if result2 == 0:raise Exception("转入账户不存在")# 提交事务self.conn.commit()return Trueexcept Exception as e:# 回滚事务self.conn.rollback()print(f"转账失败:{e}")raise e
6. 注意事项
-
连接管理
- 及时关闭数据库连接
- 使用连接池管理连接(可以使用 DBUtils 等库)
- 处理连接超时情况
-
安全性
- 使用参数化查询防止 SQL 注入
- 妥善保管数据库凭证
- 最小权限原则
-
性能优化
- 合理使用索引
- 批量操作代替循环单条操作
- 避免查询无用字段
-
错误处理
- 完善的异常处理机制
- 事务回滚
- 日志记录
相关文章:

Python使用PyMySQL操作MySQL完整指南
Python使用PyMySQL操作MySQL完整指南 1. 安装依赖 pip install pymysql2. 基础配置和数据库操作 2.1 基础配置类 import pymysql from typing import List, Dict, Optional from datetime import datetimeclass MySQLDB:def __init__(self):self.conn Noneself.cursor No…...

IAR中如何而将定义的数组放在指定的位置
在keil中可以使用下面的方法将数组定义到指定的位置 uint8_t g_usart_rx_buf[USART_REC_LEN] __attribute__ ((at(0X20001000)));但是这个方法在IAR中是用不了的,通过网上查找各种资料,发现了两种可用的方法。我这里测试的单片机是stm32f103c8t6,其他单…...

使用skywalking,grafana实现从请求跟踪、 指标收集和日志记录的完整信息记录
Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目, 2017年12月SkyWalking成为Apache国内首个个人孵化项目, 2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目, 目前SkyWalking支持Java、 .Net、 Node.js、…...

Ubuntu 20.04 24.04 双网卡 Bond 配置指南
前言:在现代服务器管理中,网络的稳定性和可靠性至关重要。为了提高网络的冗余性和负载能力,我们经常需要配置多个网络接口以实现链路聚合或故障转移。Ubuntu系统自17.10版本起,引入了Netplan作为新的网络配置抽象化工具࿰…...

深度学习之目标检测篇——残差网络与FPN结合
特征金字塔多尺度融合特征金字塔的网络原理 这里是基于resnet网络与Fpn做的结合,主要把resnet中的特征层利用FPN的思想一起结合,实现resnet_fpn。增强目标检测backone的有效性。代码实现如下: import torch from torch import Tensor from c…...

2024-2030全球及中国埋线针行业研究及十五五规划分析报告
2023年全球埋线针市场规模大约为0.73亿美元,预计2030年将达到1.37亿美元,2024-2030期间年复合增长率(CAGR)为9.5%。未来几年,本行业具有很大不确定性,本文的2024-2030年的预测数据是基于过去几年的历史发展…...

穷举vs暴搜vs深搜vs回溯vs剪枝专题一>子集
题目: 两个方法本质就是决策树的画法不同 方法一解析: 代码: class Solution {private List<List<Integer>> ret;//返回结果private List<Integer> path;//记录路径,注意返回现场public List<List<Int…...

MES系统工作流的单元测试方案
MES系统工作流的单元测试方案 在基于Java实现的MES系统中,若算子组成工作流并通过JSON传递数据,后端解析JSON后执行业务逻辑的流程,单元测试的核心是确保以下内容的正确性: 算子功能的正确性(每个算子单独的逻辑&…...

2.学习TypeScript 编译选项配置
自动编译 我们可以使用 tsc ...../.ts -w 命令进行ts文件的自动编译 执行后 编译会持续侦听 自动编译 这种方式只能侦听一个文件 对做项目肯定是不现实的,为了解决这个问题,我们需要添加一个tsconfig.json文件,写入一个基础对象 再有tsconfi…...

计算机网络之王道考研读书笔记-2
第 2 章 物理层 2.1 通信基础 2.1.1 基本概念 1.数据、信号与码元 通信的目的是传输信息。数据是指传送信息的实体。信号则是数据的电气或电磁表现,是数据在传输过程中的存在形式。码元是数字通信中数字信号的计量单位,这个时长内的信号称为 k 进制码…...

【BUG】记一次context canceled的报错
文章目录 案例分析gorm源码解读gin context 生命周期context什么时候cancel的什么时候context会被动cancel掉呢? 野生协程如何处理 案例分析 报错信息 {"L":"ERROR","T":"2024-12-17T11:11:33.0050800","file"…...

[SWPUCTF 2022 新生赛]善哉善哉
右击查看属性 然后放在010查看一下 摩斯密码解码 用佛曰解码 用md5加密看一下 最后一步md5,没有说明编码,尝试utf8和gbk ss4 施主,此次前来,不知有何贵干? import hashlib print(hashlib.md5(ss4.encode(utf8)).hexdigest())f…...

《PCI密码卡技术规范》题目
单选1 在《PCI密码卡技术规范》中,下列哪项不属于PCI密码卡的功能()。 A.密码运算功能 B.密钥管理功能 C.物理随机数产生功能 D.随主计算机可信检测功能 正确答案:D. <font style"color:#DF2A3F;">解析&…...

城市大屏设计素材宝库:助力设计师高效创作
城市大屏设计工作要求设计师在有限的时间内打造出令人惊叹的视觉效果,而拥有一套必备的素材集无疑是如虎添翼。这些素材犹如设计师的得力助手,无论是构建整体布局的设计模板,还是点缀细节的图标图形,都能在关键时刻发挥重要作用&a…...

HCIA-Access V2.5_5_1PON系统概述_PON网络概述
PON网络设备有很多各类,可应用于不同的业务场景,从而实现不同的业务,本章介绍PON系统应用组成,分析PON系统的硬件结构和模块功能,描述PON系统的应用场景,帮助你对接入网中设备形态有更深刻的印象。 你可以…...

群落生态学研究进展】Hmsc包开展单物种和多物种分析的技术细节及Hmsc包的实际应用
联合物种分布模型(Joint Species Distribution Modelling,JSDM)在生态学领域,特别是群落生态学中发展最为迅速,它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…...

一个开源的自托管虚拟浏览器项目,支持在安全、私密的环境中使用浏览器
大家好,今天给大家分享一个开源的自托管虚拟浏览器项目Neko,旨在利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,为用户提供安全、私密且多功能的浏览体验。 项目介绍 Neko利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,提供…...

职场上,如何做好自我保护?
今天我们讨论一个话题:在职场上,如何保护好自己?废话不多说,我们直接上干货。 (一) 1.时刻准备一点零食或代餐,如果遇到长时间的会议,就补充点能量。代餐最好选流体,这…...

华为数通最新题库 H12-821 HCIP稳定过人中
以下是成绩单和考试人员 HCIP H12-831 HCIP H12-725 安全中级...

mac iterm2 使用 lrzsz
前言 mac os 终端不支持使用 rz sz 上传下载文件,本文提供解决方法。 mac 上安装 brew install lrzsz两个脚本 注意:/usr/local/bin/iterm2-send-zmodem.sh 中的 sz命令路径要和你mac 上 sz 命令路径一致。 /usr/local/bin/iterm2-recv-zmodem.sh 中…...

PostgreSql-学习06-libpq之同步命令处理
目录 一、环境 二、介绍 三、函数 1、PQsetdbLogin (1)作用 (2)声明 (3)参数介绍 (4)检测成功与否 2、PQfinish (1)作用 (2࿰…...

简单配置,全面保护:HZERO审计服务让安全触手可及
HZERO技术平台,凭借多年企业资源管理实施经验,深入理解企业痛点,为您提供了一套高效易用的审计解决方案。这套方案旨在帮助您轻松应对企业开发中的审计挑战,确保业务流程的合规性和透明度。 接下来,我将为大家详细介绍…...

HCIA-Access V2.5_4_1_1路由协议基础_IP路由表
大型网络的拓扑结构一般会比较复杂,不同的部门,或者总部和分支可能处在不同的网络中,此时就需要使用路由器来连接不同的网络,实现网络之间的数据转发。 本章将介绍路由协议的基础知识、路由表的分类、静态路由基础与配置、VLAN间…...

Spring IOC 和 AOP的学习笔记
Spring框架是java开发行业的标准 Spring全家桶 Web:Spring Web MVC/Spring MVC、Spring Web Flux 持久层:Spring Data / Spring Data JPA 、Spring Data Redis 、Spring Data MongoDB 安全校验:Spring Security 构建工程脚手架ÿ…...

二七(vue2-03)、生命周期四个阶段及八个钩子、工程化开发和脚手架、组件注册、拆分组件
1. 生命周期 1.1 生命周期四个阶段 <!-- Vue生命周期:一个Vue实例从 创建 到 销毁 的整个过程。生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁1.创建阶段:创建响应式数据2.挂载阶段:渲染模板3.更新阶段:修改…...

[树] 最轻的天平
问题描述 天平的两边有时不一定只能挂物品,还可以继续挂着另一个天平,现在给你一些天平的情况和他们之间的连接关系,要求使得所有天平都能平衡所需物品的总重量最轻。 一个天平平衡当且仅当“左端点的重量 \times 左端点到支点的距离 …...

Linux udev介绍使用
udev udev配置文件匹配键和赋值键操作符解释示例修改udev配置U盘自动挂载Usb卸载SD卡挂载SD卡卸载 udev配置文件 /etc/udev/udev.conf 这个文件通常很短,他可能只是包含几行#开头的注释,然后有几行选项: udev_root“/dev/” udev_rules“/…...

单片机:实现节日彩灯(附带源码)
本项目的目标是通过编程实现几个常见的彩灯效果,包括: 流水灯效果(从左到右或从右到左)闪烁效果(所有灯同时闪烁)渐变效果(灯光从亮到灭,再从灭到亮)定时切换颜色效果&a…...

流程引擎Activiti性能优化方案
流程引擎Activiti性能优化方案 Activiti工作流引擎架构概述 Activiti工作流引擎架构大致分为6层。从上到下依次为工作流引擎层、部署层、业务接口层、命令拦截层、命令层和行为层。 基于关系型数据库层面优化 MySQL建表语句优化 Activiti在MySQL中创建默认字符集为utf8&…...

【爬虫一】python爬虫基础合集一
【爬虫一】python爬虫基础合集一 1. 网络请求了解1.1. 请求的类型1.2. 网络请求协议1.3. 网络请求过程简单图解1.4. 网络请求Headers(其中的关键字释义):请求头、响应头 2. 网络爬虫的基本工作节点2.1. 了解简单网络请求获取响应数据的过程所涉及要点 1. 网络请求了…...