SQL条件判断逻辑异常引发IndexError问题排查
问题
我想通过SQL查询返回的行数做条件判断,决定给owned_stocks表插入新行或更新现有行:查询行数为0时插入新持仓记录,行数为1时更新持仓数量。但测试用户无持仓的股票代码时,程序却执行了else分支,出现IndexError: list index out of range错误。单独执行SQL查询确认返回count为0,想问问问题出在哪?
相关代码:
count = db.execute("SELECT COUNT (symbol) FROM owned_stocks WHERE user_id=? AND symbol=?", session["user_id"], symbol["symbol"]) if count == 0: db.execute("INSERT INTO owned_stocks (symbol, current_price, stock_number, user_id) VALUES(?, ?, ?, ?)", symbol["symbol"], symbol["price"], buy_amount, session["user_id"]) else: user_amount_raw = db.execute("SELECT stock_number FROM owned_stocks WHERE symbol=? AND user_id=?", symbol["symbol"], session["user_id"]) user_amount = int(user_amount_raw[0]["stock_number"]) db.execute("UPDATE owned_stocks SET stock_number = ? WHERE id = ? AND symbol = ?", user_amount + buy_amount, session["user_id"], symbol)
错误信息:
user_amount = int(user_amount_raw[0]["stock_number"]) IndexError: list index out of range
解决方案
问题核心在于你获取count的方式错误:db.execute()返回的不是直接的数字结果,而是包含查询结果的列表(或游标对象,取决于所用数据库操作库),而非你预期的0或1。
你需要从查询结果中提取真实的计数值,修正后的代码如下:
# 执行查询并获取结果行 result = db.execute("SELECT COUNT(symbol) AS count FROM owned_stocks WHERE user_id=? AND symbol=?", session["user_id"], symbol["symbol"]) # 提取第一行的count值 count = result[0]["count"]
原代码中count变量拿到的是查询结果对象,并非数字0,因此count == 0的条件永远不成立,直接进入else分支。而此时用户无持仓,user_amount_raw是空列表,访问user_amount_raw[0]就会触发索引越界错误。
另外,你的UPDATE语句存在两处错误:
WHERE id = ?中传入的session["user_id"]是用户ID,并非owned_stocks表的主键id,应改为user_id = ?- 最后一个参数
symbol是字典,需改为symbol["symbol"]
修正后的UPDATE语句:
db.execute("UPDATE owned_stocks SET stock_number = ? WHERE user_id = ? AND symbol = ?", user_amount + buy_amount, session["user_id"], symbol["symbol"])
内容的提问来源于stack exchange,提问作者fafottos
相关产品推荐
相关产品推荐

