sqlite 的 update 操作需显式调用 commit() 提交事务,否则修改不会持久化到数据库;同时应避免字符串拼接 sql 以防注入风险。
sqlite 的 update 操作需显式调用 commit() 提交事务,否则修改不会持久化到数据库;同时应避免字符串拼接 sql 以防注入风险。
在 Python 中操作 SQLite 数据库时,UPDATE 语句执行后若未调用 conn.commit(),更改将仅存在于当前事务中,程序退出或连接关闭后自动回滚——这正是你代码“看似不生效”的根本原因。此外,原代码中直接使用 f-string 拼接 SQL 参数(如 {new_name} 和 {old_name})存在严重 SQL 注入漏洞,且因缺少引号导致语法错误(例如 filename = test.txt 会被解析为列名而非字符串值)。
✅ 正确做法如下:
- 必须调用 conn.commit():在 cursor.execute() 后显式提交事务;
- 使用参数化查询:通过 ? 占位符传递参数,由 SQLite 自动处理转义与类型适配;
- 确保资源释放:推荐使用 with 语句自动管理连接和游标,避免遗漏 close()。
以下是安全、健壮的重构版本:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
import sqlite3
import os
def update(self, old_name, new_name):
db_path = os.path.join(self._path, "files.db")
try:
with sqlite3.connect(db_path) as conn:
cursor = conn.cursor()
# ✅ 使用参数化查询,防止 SQL 注入
query = "UPDATE files SET filename = ? WHERE filename = ?"
cursor.execute(query, (new_name, old_name))
conn.commit() # ✅ 关键:提交事务
return True
except sqlite3.Error as e:
return f"数据库错误:{e}"
except Exception as e:
return f"未知错误:{e}"
⚠️ 注意事项:
- with sqlite3.connect(...) 会自动提交成功事务(或回滚异常),但显式调用 commit() 更清晰、可控;
- 若 old_name 在表中不存在,UPDATE 不报错但影响行为为 0 行,建议通过 cursor.rowcount 检查是否实际更新:
cursor.execute(query, (new_name, old_name)) if cursor.rowcount == 0: return "警告:未找到匹配的旧文件名,无记录被更新"
总结:SQLite 是轻量级嵌入式数据库,其事务默认处于手动提交模式(isolation_level=None 除外),务必牢记“执行 → 提交 → 关闭”三步;而参数化查询不仅是安全刚需,更是编写可维护数据库代码的基本规范。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










