【Python 操作 MySQL 数据库】
在 Python 中操作 MySQL 数据库主要通过 pymysql
或 mysql-connector-python
库实现。以下是完整的技术指南,包含连接管理、CRUD 操作和最佳实践:
一、环境准备
1. 安装驱动库
pip install pymysql # 推荐(纯Python实现)
# 或
pip install mysql-connector-python # Oracle官方驱动
2. 数据库准备
CREATE DATABASE testdb;
USE testdb;CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) UNIQUE NOT NULL,email VARCHAR(100) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
二、连接管理
1. 基础连接
import pymysql# 建立连接
conn = pymysql.connect(host='localhost',user='root',password='your_password',database='testdb',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor # 返回字典格式结果
)
2. 上下文管理器(推荐)
with pymysql.connect(host='localhost', user='root', password='your_pwd', database='testdb') as conn:with conn.cursor() as cursor:# 执行SQL操作pass# 连接在此处自动提交/回滚(取决于autocommit设置)
三、CRUD 操作
1. 查询数据
def get_user(username):try:with conn.cursor() as cursor:sql = "SELECT * FROM users WHERE username = %s"cursor.execute(sql, (username,))result = cursor.fetchone() # 获取单条记录return resultexcept pymysql.MySQLError as e:print(f"数据库错误: {e}")return Noneuser = get_user("john_doe")
print(user) # 输出: {'id': 1, 'username': 'john_doe', ...}
2. 插入数据
def create_user(username, email):try:with conn.cursor() as cursor:sql = """INSERT INTO users (username, email) VALUES (%s, %s)"""cursor.execute(sql, (username, email))conn.commit() # 显式提交事务return cursor.lastrowid # 返回自增IDexcept pymysql.IntegrityError:print("用户名已存在")conn.rollback()return Nonenew_id = create_user("jane_smith", "jane@example.com")
3. 更新数据
def update_email(user_id, new_email):try:with conn.cursor() as cursor:sql = "UPDATE users SET email = %s WHERE id = %s"affected_rows = cursor.execute(sql, (new_email, user_id))conn.commit()return affected_rows > 0except pymysql.MySQLError:conn.rollback()return False
4. 批量操作
def batch_insert(users):try:with conn.cursor() as cursor:sql = "INSERT INTO users (username, email) VALUES (%s, %s)"cursor.executemany(sql, users) # 批量执行conn.commit()return cursor.rowcountexcept pymysql.MySQLError:conn.rollback()return 0batch_insert([("user1", "u1@test.com"),("user2", "u2@test.com")
])
四、高级技巧
1. 连接池管理
from dbutils.pooled_db import PooledDBpool = PooledDB(creator=pymysql,maxconnections=10,host='localhost',user='root',password='your_pwd',database='testdb'
)# 使用连接池获取连接
conn = pool.connection()
2. 存储过程调用
with conn.cursor() as cursor:cursor.callproc('get_user_stats', (1,)) # 调用存储过程result = cursor.fetchall()
3. 事务控制
try:with conn.cursor() as cursor:# 执行多个操作cursor.execute("UPDATE account SET balance = balance - 100 WHERE id = 1")cursor.execute("UPDATE account SET balance = balance + 100 WHERE id = 2")conn.commit() # 显式提交事务
except:conn.rollback() # 回滚所有操作
五、安全实践
1. 防止SQL注入
- 永远使用参数化查询(不要拼接字符串)
# 正确方式 cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))# 危险方式(禁用!) cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
2. 敏感信息处理
- 使用环境变量存储密码:
import os password = os.getenv('DB_PASSWORD')
3. 连接超时设置
conn = pymysql.connect(connect_timeout=5, # 连接超时5秒read_timeout=10 # 读取超时10秒
)
六、性能优化
1. 查询优化
-
添加索引:
ALTER TABLE users ADD INDEX idx_email (email);
-
使用EXPLAIN分析查询:
with conn.cursor() as cursor:cursor.execute("EXPLAIN SELECT * FROM users WHERE username = %s", ("john",))print(cursor.fetchall())
2. 结果集处理
-
分页查询:
sql = "SELECT * FROM users LIMIT %s OFFSET %s" cursor.execute(sql, (page_size, (page-1)*page_size))
-
流式读取(大数据量):
with conn.cursor(pymysql.cursors.SSCursor) as cursor: # 使用服务器端游标cursor.execute("SELECT * FROM large_table")for row in cursor:process(row)
七、完整示例
import pymysql
from contextlib import contextmanager@contextmanager
def database_connection():conn = pymysql.connect(host='localhost',user='root',password='your_pwd',database='testdb',charset='utf8mb4')try:yield connfinally:conn.close()def main():with database_connection() as conn:with conn.cursor() as cursor:# 创建用户cursor.execute("""INSERT INTO users (username, email)VALUES (%s, %s)""", ("new_user", "user@example.com"))user_id = cursor.lastrowid# 查询用户cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))print(cursor.fetchone())# 更新记录cursor.execute("""UPDATE users SET email = %s WHERE id = %s""", ("new_email@example.com", user_id))conn.commit()if __name__ == "__main__":main()
八、故障排查
1. 常见错误码
1045
: 访问被拒绝(检查用户名/密码)2003
: 无法连接(检查主机/端口)1062
: 唯一键冲突1146
: 表不存在
2. 日志记录
import logging
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s - %(levelname)s - %(message)s'
)# 在连接参数中添加
conn = pymysql.connect(..., cursorclass=pymysql.cursors.SSDictCursor,client_flag=pymysql.client.CLIENT.MULTI_STATEMENTS)
通过遵循这些实践,可以构建安全、高效的数据库交互应用。对于复杂场景,建议结合ORM框架(如SQLAlchemy)进行抽象层开发。
相关文章:
【Python 操作 MySQL 数据库】
在 Python 中操作 MySQL 数据库主要通过 pymysql 或 mysql-connector-python 库实现。以下是完整的技术指南,包含连接管理、CRUD 操作和最佳实践: 一、环境准备 1. 安装驱动库 pip install pymysql # 推荐(纯Python实现࿰…...
编译opencv4.11gstreamer 参考
0xC0000139: Entry Point Not Found gstreamer-1.0 如需要编译gstreamer模块需要提前安装好2个文件Index of /data/pkg/windows 下载带msvc的表示用Visual Studio编译 gif功能顺便勾上 最后 测试可能遇到的问题 把F:\gstreamer\1.0\x86_64\bin目录下的所有dll复制到exe所在位置…...
OpenCV边界填充(Border Padding)详解:原理、方法与代码实现
一、什么是边界填充? 边界填充(Border Padding)是图像处理中一项基础而重要的技术,它通过在图像边缘周围添加像素来解决卷积等操作导致的边界问题。当我们对图像应用滤波器或进行卷积操作时,图像边缘的像素无法像中心…...
Deeper and Wider Siamese Networks for Real-Time Visual Tracking
现象: the backbone networks used in Siamese trackers are relatively shallow, such as AlexNet , which does not fully take advantage of the capability of modern deep neural networks. direct replacement of backbones with existing powerful archite…...
保安员考试报名时,体检项目包含哪些?
保安员考试报名时的体检项目主要包括以下几类: 实验室检查:血常规、尿常规、大便常规是必检项目,主要用于检查血液、尿液和消化系统是否存在问题。部分地区可能还会检查肝功能、肾功能等,通过检测相关指标来评估肝脏和肾脏的功能状…...
基于SpringBoot的房屋租赁管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
MCU开发学习记录16* - 看门狗学习与实践(HAL库) - IWDG与WWDG -STM32CubeMX
名词解释: IWDG:Independent watchdog WWDG:Window watchdog LSE:Low-Speed External Clock 统一文章结构(数字后加*): 第一部分: 阐述外设工作原理;第二部分&#…...
如何解决LCMS 液质联用液相进样器定量环漏液问题
以下是解决安捷伦1260液相色谱仪为例的进样器定量环漏液问题的一些方法:视频操作 检查相关部件 检查定量环本身:观察定量环是否有破损、裂纹或变形等情况。如果发现定量环损坏,需及时更换。检查密封垫:查看进样阀的转子密封垫、计…...
【Linux】ssh命令 – 安全的远程连接服务
原创:厦门微思网络 SSH命令的概念 ssh命令的功能是安全地远程连接服务器主机系统,作为OpenSSH套件中的客户端连接工具,ssh命令可以让我们轻松地基于SSH加密协议进行远程主机访问,从而实现对远程服务器的管理工作。 语法 ssh 参…...
硬件中的OID是什么?SNMP如何通过OID获取信息?——用“图书馆”比喻彻底讲清底层原理-优雅草卓伊凡|小无
硬件中的OID是什么?SNMP如何通过OID获取信息?——用“图书馆”比喻彻底讲清底层原理-优雅草卓伊凡|小无 1. 终极比喻:OID是设备的“图书编码系统” 想象你走进一座巨型图书馆(这个图书馆就是一台网络设备,比如路由器…...
java后端学习
1.Java基础 Java基础学习-CSDN博客 2.spring->springboot spring学习->sprintboot-CSDN博客 3.maven Maven-CSDN博客 4mybatis ->mybatisplus mybatis ->mybatisplus-CSDN博客 5.git操作学习 git版本控制学习-CSDN博客 6.mysql …...
Python打卡 DAY 27
知识点回顾: 1. 装饰器的思想:进一步复用 2. 函数的装饰器写法 3. 注意内部函数的返回值 作业: 编写一个装饰器 logger,在函数执行前后打印日志信息(如函数名、参数、返回值) def logger(func):def wrap…...
2025蓝桥杯JAVA编程题练习Day8
1. 路径 题目描述 小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图 中的最短路径。 小蓝的图由 2021 个结点组成,依次编号 1 至 2021。 对于两个不同的结点 a, b,如果 a 和 b 的差的绝对值大于 21࿰…...
7 个正则化算法完整总结
哈喽!我是我不是小upper~之前和大家聊过各类算法的优缺点,还有回归算法的总结,今天咱们来深入聊聊正则化算法!这可是解决机器学习里 “过拟合” 难题的关键技术 —— 想象一下,模型就像个死记硬背的学生&am…...
lesson03-简单回归案例(理论+代码)
一、梯度下降 二、 线性方程怎么样? 三、有噪音吗? 四、让我们看一个列子 五、如何优化 启发式搜索 学习进度 六、线性回归、逻辑回归、分类 总结、 简单线性回归是一种统计方法,用于确定两个变量之间的关系。具体来说,它试图…...
Linux系统篇——文件描述符FD
🧠 Linux 文件描述符(File Descriptor)详解与学习指南 一、什么是文件描述符(fd) 在 Linux 中,一切皆文件(everything is a file),包括普通文件、目录、套接字ÿ…...
C++ Kafka客户端(cppkafka)安装与问题解决指南
一、cppkafka简介 cppkafka是一个现代C的Apache Kafka客户端库,它是对librdkafka的高级封装,旨在简化使用librdkafka的过程,同时保持最小的性能开销。 #mermaid-svg-qDUFSYLBf8cKkvdw {font-family:"trebuchet ms",verdana,arial,…...
MySQL的缓存策略
一、MySQL缓存方案用来解决什么 缓存用户定义的热点数据,用户直接从缓存获取热点数据,降低数据库的读写压力场景分析: 内存访问速度是磁盘访问速度 10 万倍(数量级)读的需求远远大于写的需求mysql 自身缓冲层跟业务无…...
ubuntu22.04卸载vscode
方法 1:通过 Snap 卸载 VSCode 如果你是通过 Snap 安装的 VSCode(Ubuntu 22.04 默认推荐方式),按照以下步骤卸载: 检查是否通过 Snap 安装: bash snap list | grep code如果输出显示 code,说明…...
主流数据库排查与优化速查手册
主流数据库排查与优化速查手册(优化版) 一、连接失败 1.1 统一排查流程 #mermaid-svg-IIyarbd8VatJFN14 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IIyarbd8VatJFN14 .error-icon{fill:…...
MySQL 数据库优化:InnoDB 存储引擎深度解析:架构、调优与最佳实践
InnoDB 是 MySQL 的默认存储引擎,因其支持事务、行级锁和崩溃恢复等特性,广泛应用于高并发、数据一致性要求高的场景。本文将从 InnoDB 的核心架构、调优策略、监控诊断、高级特性 到 备份恢复 进行系统性分析,并结合代码示例与实战案例,帮助开发者全面掌握其应用与优化技巧…...
[AI算法] LLM训练-构建transformers custom model
文章目录 1. 继承与实现基础结构2. 支持 DeepSpeed 和 Accelerate 的注意事项a. 模型输出格式b. 设备管理c. 分布式训练兼容性d. DeepSpeed 特定优化 3. 训练脚本集成建议4. 测试与调试建议 在使用 Hugging Face 的 transformers 库时,若要自定义一个继承自 PreTrai…...
突发,苹果发布下一代 CarPlay Ultra
汽车的平均换代周期一般都超过5年,对于老旧燃油车而言,苹果的 Carplay 是黑暗中的明灯,是延续使用寿命的利器。 因为你可能不需要冰箱彩电大沙发,但一定需要大屏车载导航、倒车影像、车载听歌。如果原车不具备这个功能࿰…...
git克隆github项目到本地的三种方式
本文旨在使用git工具将别人发布在github上的项目保存到本地 1.安装git,创建github账户,并使用ssh关联自己的github账号和git,具体教程可以参照下面两篇文章: Github入门教程,适合新手学习(非常详细&#…...
Excel MCP: 自动读取、提炼、分析Excel数据并生成可视化图表和分析报告
最近,一款Excel MCP Server的开源工具火了,看起来功能很强大,咱们今天来一探究竟。 基础环境 最近两年,大家都可以看到AI的发展有多快,我国超10亿参数的大模型,在短短一年之内,已经超过了100个&…...
香港 GPU 服务器优势及使用场景解析
在快速发展的科技领域,数据处理和复杂计算已成为众多行业的支柱,GPU 服务器的重要性不容小觑。GPU 服务器是内部集成一个或多个 GPU的物理服务器,用于执行每个用例所需的任务。而香港 GPU 服务器,是指部署在中国香港数据中心、配备…...
Go语言交替打印问题及多种实现方法
Go语言交替打印问题及多种实现方法 在并发编程中,多个线程(或 goroutine)交替执行任务是一个经典问题。本文将以 Go 语言为例,介绍如何实现多个 goroutine 交替打印数字的功能,并展示几种不同的实现方法。 Go 语言相关…...
Grafana分布统计:Heatmap面板
Heatmap是是Grafana v4.3版本以后新添加的可视化面板,通过热图可以直观的查看样本的分布情况。在Grafana v5.1版本中Heatmap完善了对Prometheus的支持。这部分,将介绍如何使用HeatmapPanel实现对Prometheus监控指标的可视化。 使用Heatmap可视化Histogr…...
rk3576 gstreamer opencv
安装gstreamer rk3588使用gstreamer推流_rk3588 gstreamer-CSDN博客 rk3588使用gstreamer推流_rk3588 gstreamer-CSDN博客 Installing on Linux sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-pl…...
用户现场不支持路由映射,如何快速将安防监控EasyCVR视频汇聚平台映射到公网?
一、方案背景 随着数字化安防与智能交通管理发展,视频监控远程管理需求激增。EasyCVR作为专业视频融合平台,具备多协议接入等核心功能,是智能监控的重要工具。但实际部署中,当EasyCVR处于内网且路由器无法进行端口映射时&#…...
棋牌室台球室快速接入美团团购接口
北极星平台从2024年12月份开始慢慢关闭,现在很多开发者反馈北极星token已经不能刷新了,全部迁移到美团团购综合平台。 申请这个平台要求很高 1、保证金费用要15万起步 2、平台必须是二级等保和安全产品 ,一个二级等保费用10万起步 所以很多…...
Qwen3技术报告解读:训练秘籍公开,推理与非推理模型统一,大模型蒸馏小模型(报告详细解读)
1.简介 Qwen3 是 Qwen 模型家族的最新版本,它是一系列大型语言模型(LLMs),旨在提升性能、效率和多语言能力。基于广泛的训练,Qwen3 在推理、指令遵循、代理能力和多语言支持方面取得了突破性进展,具有以下…...
entity线段材质设置
在cesium中,我们可以改变其entity线段材质,这里以直线为例. 首先我们先创建一条直线 const redLine viewer.entities.add({polyline: {positions: Cesium.Cartesian3.fromDegreesArray([-75,35,-125,35,]),width: 5,material:material, 保存后可看到在地图上创建了一条线段…...
Word图片格式调整与转换工具
软件介绍 本文介绍的这款工具主要用于辅助Word文档处理。 图片排版功能 经常和Word打交道的人或许都有这样的困扰:插入的图片大小各异,排列也参差不齐。若不加以调整,遇到要求严格的领导,可能会让人颇为头疼。 而这款工具能够统…...
小刚说C语言刷题—1700请输出所有的2位数中,含有数字2的整数
1.题目描述 请输出所有的 2 位数中,含有数字 2 的整数有哪些,每行 1个,按照由小到大输出。 比如: 12、20、21、22、23… 都是含有数字 2的整数。 输入 无 输出 按题意要求由小到大输出符合条件的整数,每行 1 个。…...
视频抽帧并保存blob
视频抽帧 /*** description 获取文件中的每一帧* param { File } file* param { Number } time 每一帧的时间间隔(单位:秒)* param { Boolean } isUseInterval 是否使用间隔 为false只会获取这一帧* returns { Map }* example await captureFrame({ file, 20 }) > M…...
opencloudos 安装 mosquitto
更新系统并安装依赖 sudo dnf update -y sudo dnf install -y epel-release # 若需要 EPEL 额外仓库 sudo dnf install -y gcc-c cmake openssl-devel c-ares-devel libuuid-devel libwebsockets-devel安装 Mosquitto 通过默认仓库安装(推荐) sudo dn…...
STM32CubeMX使用SG90舵机角度0-180°
1. 配置步骤 1.1 硬件连接 舵机信号线 → STM32的PWM输出引脚(如 PA2,对应定时器 TIM2_CH3)。 电源和地 → 外接5V电源(确保共地)。 1.2 定时器配置(以TIM2为例) 在STM32CubeMX中࿱…...
【Umi】项目初始化配置和用户权限
app.tsx import { RunTimeLayoutConfig } from umijs/max; import { history, RequestConfig } from umi; import { getCurrentUser } from ./services/auth; import { message } from antd;// 获取用户信息 export async function getInitialState(): Promise<{currentUse…...
使用哈希表封装myunordered_set和myunordered_map
文章目录 使用哈希表封装myunordered_set和myunordered_map实现出复用哈希表框架,并支持insert支持迭代器的实现constKey不能被修改unordered_map支持[ ]结语 我们今天又见面啦,给生活加点impetus!!开启今天的编程之路!…...
光学变焦和数字变倍模块不同点概述!
一、光学变焦与数字变倍模块的不同点 1. 物理基础 光学变焦:通过调整镜头组中镜片的物理位置改变焦距,实现无损放大。例如,上海墨扬的MF-STAR吊舱采用30倍光学变焦镜头,焦距范围6~180mm,等效焦距可达997mm。 数字…...
Spring MVC 中请求处理流程及核心组件解析
在 Spring MVC 中,请求从客户端发送到服务器后,需要经过一系列组件的处理才能最终到达具体的 Controller 方法。这个过程涉及多个核心组件和复杂的映射机制,下面详细解析其工作流程: 1. 核心组件与请求流程 Spring MVC 的请求处…...
《100天精通Python——基础篇 2025 第19天:并发编程启蒙——理解CPU、线程与进程的那些事》
目录 一、计算机基础知识1.1 计算机发展简史1.2 计算机的分类1.2.1 超级计算机(Supercomputer)1.2.2 大型机(Mainframe Computer)1.2.3 迷你计算机(Minicomputer)---- 普通服务器1.2.4 工作站(W…...
<PLC><视觉><机器人>基于海康威视视觉检测和UR机械臂,如何实现N点标定?
前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,相关设备如触摸屏(HMI)、交换机等工控产品,如果有…...
FC7300 WDG MCAL 配置引导
在WDG模块中,用户需要选择GPT资源,因此在配置WDG组件之前,需要先选择GPT通道。WDG包含三个组件,每一个组件对应不同的硬件。 Wdg:对应WDOG0Wdg_174_Instance1:对应WDOG1Wdg_174_Instance2:对应WDOG2一、WDG 组件 1. General Wdg Disable Allowed:是否允许在WDG运行过程…...
Leaflet 自定义瓦片地图与 PHP 大图切图算法 解决大图没办法在浏览器显示的问题
为什么使用leaflet 使用 Leaflet 来加载大图片(尤其是通过瓦片化的方式)是一种高效的解决方案,主要原因如下: 1. 性能优化 减少内存占用:直接加载大图片会占用大量内存,可能导致浏览器崩溃或性能下降。瓦片…...
MySQL——十、InnoDB引擎
MVCC 当前读: 读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。 -- 当前读 select ... lock in share mode(共享锁) select ... for update update insert delete (排他锁)快照读:…...
import pywinauto后tkinter.filedialog.askdirectory()无法调用,直接卡死,应如何解决
诸神缄默不语-个人技术博文与视频目录 具体情况就是我需要用pywinauto进行一些软件的自动化操作,同时需要将整个代码功能用tkinter的可视化界面来展示,在调用filedialog.askdirectory()的时候代码直接不运行了,加载不出来。我一开始还以为是…...
display:grid网格布局属性说明
网格父级 :display:grid(块级网格)/ inline-grid(行内网格) 注意:当设置网格布局,column、float、clear、vertical-align的属性是无效的。 HTML: <ul class"ls02 f18 mt50 sysmt30&…...
初识——QT
QT安装方法 一、项目创建流程 创建项目 入口:通过Qt Creator的欢迎页面或菜单栏(文件→新建项目)创建新项目。 项目类型:选择「Qt Widgets Application」。 路径要求:项目路径需为纯英文且不含特殊字符。 构建系统…...