You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLite更新查询中用If Else实现状态判断更新或回滚?

解决SQLite中基于订单状态的更新/回滚逻辑问题

原代码的核心问题

  1. SQL注入风险:用format拼接SQL语句存在安全隐患,应使用参数化查询替代
  2. 查询冗余:无需查询整行数据,仅需获取status列的值即可满足判断需求
  3. 判断逻辑错误:fetchall()返回的是元组组成的列表,直接判断字符串'Status == "Closed" '是否在其中完全不成立

最优简便实现方案

直接查询目标订单的status值,基于结果执行事务操作:

import sqlite3

# 获取目标订单号(假设inv_sta2_e2.get()可转换为整数)
target_inv_no = int(inv_sta2_e2.get())

con6 = sqlite3.connect("inv_clossing_datail_1.db")
cur6 = con6.cursor()

try:
    # 参数化查询,仅获取目标订单的status列
    cur6.execute('SELECT status FROM inv_closing_db WHERE Invoice_no = ?', (target_inv_no,))
    result = cur6.fetchone()

    if not result:
        print("未找到该订单")
    else:
        order_status = result[0].lower()  # 统一转为小写,避免大小写不一致导致判断失误
        if order_status == 'closed':
            print("该订单已关闭,执行回滚")
            con6.rollback()  # 若此前未开启事务,可根据实际业务场景调整
        elif order_status == 'open':
            print("该订单为开启状态,执行更新操作")
            # 执行更新语句,同样使用参数化查询
            cur6.execute('UPDATE inv_closing_db SET [需更新的列名] = ? WHERE Invoice_no = ?', 
                         (更新值, target_inv_no))
            con6.commit()  # 提交事务,确认更新
finally:
    # 确保数据库连接关闭
    con6.close()

关键说明

  • 参数化查询:用?作为占位符,既避免SQL注入风险,又适配SQLite语法规范
  • 事务处理:通过commit()提交有效更新,rollback()执行回滚,保证数据操作的一致性
  • 高效查询:仅查询所需的status列,减少数据传输量,提升查询效率
  • 兼容性处理:将状态值转为小写,避免因存储时大小写差异导致的判断错误

内容的提问来源于stack exchange,提问作者Jahan Zabe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:20:54