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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:10:54