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

SQLite插入无报错但未生效及lastrowid异常问题求助

问题排查与修复方案

核心问题分析

你的代码存在几个关键逻辑错误,导致数据插入异常:

  • 提前引用未定义变量:在try块内的第二条INSERT INTO Game语句中,你使用了还未赋值的the_game_id,这不仅会产生无效数据,还会干扰lastrowid的正确获取。
  • 重复插入Game表:你不需要插入两条Game记录,第二条属于错误操作,会导致Game表出现冗余数据,且lastrowid会指向这条无效记录的ID(始终为1可能是因为这条错误插入打乱了ID自增逻辑)。
  • 异常捕获范围不足:获取lastrowid、插入Player表等操作都在try块之外,一旦这些步骤出错,不会被捕获,导致静默失败。
  • 连接管理混乱:多次重复打开/关闭数据库连接,增加了出错概率,且没有利用Python的上下文管理器来自动管理资源。

修复后的代码

def add_a_game(self, gameName, player1ID, player2ID):
    the_game_id = None
    try:
        # 使用上下文管理器自动管理连接和游标,无需手动close
        with sqlite3.connect("phylib.db") as conn:
            cursor = conn.cursor()
            
            # 仅插入一条Game记录,这是正确的业务操作
            cursor.execute("INSERT INTO Game (GAMENAME) VALUES (?)", (gameName,))
            # 获取刚插入记录的自增ID
            the_game_id = cursor.lastrowid
            
            # 批量插入Player关联记录
            cursor.execute("INSERT INTO Player (GAMEID, PLAYERNAME) VALUES (?, ?)", (the_game_id, player1ID))
            cursor.execute("INSERT INTO Player (GAMEID, PLAYERNAME) VALUES (?, ?)", (the_game_id, player2ID))
            
            # 上下文管理器会自动执行commit,发生异常时自动回滚
    except sqlite3.Error as er:
        print('SQLite error: %s' % (' '.join(er.args)))
        print("Exception class is: ", er.__class__)
    
    return the_game_id

关键修复点说明

  1. 移除错误的重复插入:删除了第二条INSERT INTO Game语句,只保留插入gameName的有效操作。
  2. 使用上下文管理器:with sqlite3.connect(...)会自动处理连接的打开、提交和关闭,避免手动管理的疏漏。
  3. 统一操作在一个连接内:Game和Player表的插入操作在同一个连接中完成,保证数据一致性,减少连接开销。
  4. 扩大异常捕获范围:所有数据库操作都放在try块内,任何错误都会被捕获并打印,便于排查。
  5. 正确获取lastrowid:在插入Game记录后立即获取lastrowid,确保拿到的是刚插入的有效记录ID。

内容的提问来源于stack exchange,提问作者Rochishnu Akkineni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:55:56