Python+SQLite3:仅pwd.db更新,其余两数据库无变化,求排查
问题排查与修复方案
核心问题分析
- 连接变量覆盖:在第一个
with con上下文块内,重新给con赋值为pwd_used.db的连接,破坏了原上下文的事务管理逻辑,导致后续对pwd_used.db和wlt.db的操作无法正确提交。 - UPDATE语句表名错误:更新钱包时写的
UPDATE cash SET cash=?,实际表名应为wlt(查询时用的是wlt表),导致更新语句无效。 - 参数格式错误:
cur.execute("UPDATE ...", (cash))中(cash)不是合法的元组,SQLite要求参数以元组形式传递,应改为(cash,)。 - 无限循环未终止:找到匹配的密码后没有终止循环,会继续执行直到
fetchone()返回None触发异常,掩盖了后续操作的错误信息。 - 宽泛异常捕获:
except:会捕获所有异常,包括数据库操作的错误,导致无法定位具体问题。
修正后的代码
import sqlite3 import os # 用os.path.join拼接路径,避免硬编码兼容问题 db_dir = os.path.join(os.getcwd(), "dbs") password_db = os.path.join(db_dir, "pwd.db") used_db = os.path.join(db_dir, "pwd_used.db") wallet_db = os.path.join(db_dir, "wlt.db") valuta = 0 to_check = input("Geef de verkregen code: ") # 处理可用密码数据库 with sqlite3.connect(password_db) as pwd_con: pwd_cur = pwd_con.cursor() # 直接查询匹配的代码,无需遍历所有行 pwd_cur.execute("SELECT code, value FROM pwd WHERE code = ?", (to_check,)) row = pwd_cur.fetchone() if row: invoer1, invoer2 = row valuta = int(invoer2) print("Je hebt een juiste code ingevoerd") print(f"En je heb hiermee {valuta} coins verdiend.") # 删除可用密码 pwd_cur.execute("DELETE FROM pwd WHERE code = ?", (invoer1,)) # 处理已用密码数据库 with sqlite3.connect(used_db) as used_con: used_cur = used_con.cursor() used_cur.execute("INSERT INTO pwd_used (code, value) VALUES (?, ?)", (invoer1, invoer2)) # 处理钱包数据库 with sqlite3.connect(wallet_db) as wallet_con: wallet_cur = wallet_con.cursor() # 查询当前现金 wallet_cur.execute("SELECT cash FROM wlt WHERE onlyone = 1") huidige_waarde = wallet_cur.fetchone() if huidige_waarde: current_cash = huidige_waarde[0] new_cash = current_cash + valuta # 修正表名和参数格式 wallet_cur.execute("UPDATE wlt SET cash = ? WHERE onlyone = 1", (new_cash,)) else: print("Ongeldige code!")
关键优化点
- 用
os.path.join拼接路径,避免硬编码路径分隔符和截取长度,提升跨平台兼容性。 - 直接通过WHERE条件查询匹配的密码,无需遍历所有行,提升执行效率。
- 每个数据库单独使用
with上下文管理器,确保事务自动提交,避免连接变量覆盖。 - 移除宽泛的异常捕获,改为显式处理不存在的情况,便于调试问题。
- 修正UPDATE语句的表名和参数格式,确保更新操作生效。
内容的提问来源于stack exchange,提问作者Edwin van Unen
相关产品推荐
相关产品推荐

