0

0

如何正确使用 PyMySQL 实现 MySQL 数据库的更新、删除与查询操作

心靈之曲

心靈之曲

发布时间:2025-12-30 20:14:02

|

911人浏览过

|

来源于php中文网

原创

如何正确使用 PyMySQL 实现 MySQL 数据库的更新、删除与查询操作

本文详解 pymysql 中 update、delete 和 select 操作的常见陷阱与最佳实践,重点解决“执行无报错但数据未变更”“搜索提示‘无记录’”等典型问题,并提供可直接复用的安全代码模板。

在使用 PyMySQL 进行数据库操作时,许多开发者(尤其是初学者)会遇到一种“静默失败”现象:调用 update 或 delete 后弹出成功提示,但数据库实际未变化;执行 search 时始终返回“无此记录”。这并非 PyMySQL 的 Bug,而是由参数绑定失效、事务未提交、主键匹配错误或变量状态不同步等常见原因导致。

以下以你提供的 update() 函数为例,逐层剖析并给出健壮解决方案:

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

下载

✅ 正确的 UPDATE 示例(含错误防护)

def update():
    try:
        sqlCon = pymysql.connect(
            host="localhost",
            user="root",
            password="root",
            database="varehusdb",
            autocommit=False  # 显式关闭自动提交,便于手动控制事务
        )
        cur = sqlCon.cursor()

        # ? 调试:打印待更新值(强烈建议开发阶段保留)
        vnr_val = VNr.get().strip()
        print(f"[DEBUG] Updating VNr='{vnr_val}' with: "
              f"Betegnelse='{Betegnelse.get()}', Pris='{Pris.get()}', "
              f"KatNr='{KatNr.get()}', Antall='{Antall.get()}', Hylle='{Hylle.get()}'")

        # ⚠️ 关键:确保 VNr 不为空且为有效值(避免 WHERE 1=1 类误更新)
        if not vnr_val:
            tkinter.messagebox.showerror("Update Error", "VNr cannot be empty!")
            return

        # 执行参数化更新(防止 SQL 注入,且确保类型安全)
        rows_affected = cur.execute(
            "UPDATE vare SET Betegnelse=%s, Pris=%s, KatNr=%s, Antall=%s, Hylle=%s WHERE VNr=%s",
            (
                Betegnelse.get(),
                Pris.get(),
                KatNr.get(),
                Antall.get(),
                Hylle.get(),
                vnr_val  # 使用已校验的局部变量,避免后续 get() 值突变
            )
        )

        if rows_affected == 0:
            tkinter.messagebox.showwarning("Update Warning", f"No record found with VNr='{vnr_val}'")
            return

        sqlCon.commit()  # ✅ 必须显式 commit!autocommit=False 时尤其关键
        tkinter.messagebox.showinfo("Success", "Record updated successfully!")

    except Exception as e:
        sqlCon.rollback()  # 发生异常时回滚
        tkinter.messagebox.showerror("Database Error", f"Update failed: {str(e)}")
    finally:
        if 'cur' in locals(): cur.close()
        if 'sqlCon' in locals(): sqlCon.close()

❌ DELETE 和 SEARCH 失败的常见原因与修复

问题类型 典型原因 解决方案
DELETE 无效果 WHERE 条件未匹配到任何行(如 VNr.get() 返回空字符串、前后空格、类型不匹配) 使用 .strip() 清理输入;用 cur.rowcount 检查影响行数;添加 if rows_affected == 0 提示
SEARCH 无结果 查询后未调用 cur.fetchall() / cur.fetchone();或 UI 组件(如 Text 或 Treeview)未清空旧数据再插入新结果 确保 execute() 后立即获取结果,并在插入前清空显示控件
所有操作均无效 数据库连接未真正建立(如密码错误但被静默忽略)、表名/字段名拼写错误、字符集不匹配(如中文乱码导致 WHERE 不匹配) 添加 sqlCon.ping(reconnect=True) 验证连接;用 MySQL 客户端手动执行相同 SQL 验证逻辑

✅ 推荐的 SEARCH 示例(带结果展示)

def search():
    keyword = VNr.get().strip()
    if not keyword:
        tkinter.messagebox.showinfo("Search", "Please enter a VNr to search.")
        return

    try:
        sqlCon = pymysql.connect(host="localhost", user="root", password="root", database="varehusdb")
        cur = sqlCon.cursor()
        cur.execute("SELECT * FROM vare WHERE VNr = %s", (keyword,))
        result = cur.fetchone()

        if result:
            # 假设你用 Entry 控件显示结果(按字段顺序赋值)
            Betegnelse.set(result[1])  # 假设 Betegnelse 是第2列
            Pris.set(result[2])
            KatNr.set(result[3])
            Antall.set(result[4])
            Hylle.set(result[5])
            tkinter.messagebox.showinfo("Search Result", f"Found: {result[1]}")
        else:
            tkinter.messagebox.showinfo("Search Result", "No record found.")

    except Exception as e:
        tkinter.messagebox.showerror("Search Error", str(e))
    finally:
        if 'cur' in locals(): cur.close()
        if 'sqlCon' in locals(): sqlCon.close()

? 关键总结

  • 永远检查 cursor.rowcount:它告诉你 SQL 实际影响了多少行,是判断操作是否生效的黄金指标;
  • 绝不依赖 .get() 多次调用:GUI 输入可能在函数执行中被修改,应先 .get().strip() 存入局部变量;
  • 事务必须显式管理:autocommit=False 时,commit() 不可省略;生产环境建议统一用 with 语句或上下文管理器封装连接;
  • 调试从 print() 开始:在 execute() 前打印所有参数值,90% 的“无效果”问题由此暴露;
  • 验证 SQL 本身:将生成的参数化 SQL(替换 %s 后)粘贴到 MySQL Workbench 中执行,确认逻辑正确性。

遵循以上原则,你的 Update、Delete 和 Search 功能将稳定可靠,告别“看似成功,实则无效”的困扰。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

674

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

319

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

345

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1084

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

355

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

671

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

564

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

408

2024.04.29

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 777人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号