如何在SQLite更新查询中用If Else实现状态判断更新或回滚?
解决SQLite中基于订单状态的更新/回滚逻辑问题
原代码的核心问题
- SQL注入风险:用
format拼接SQL语句存在安全隐患,应使用参数化查询替代 - 查询冗余:无需查询整行数据,仅需获取
status列的值即可满足判断需求 - 判断逻辑错误:
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
相关产品推荐
相关产品推荐

