Python数据库操作报错:无法将fetchall返回的tuple转为int
解决方法
首先,你遇到的int() argument must be a string, a bytes-like object or a number, not 'tuple'错误,根源是cursor.fetchall()[-1]返回的是一行数据的元组(比如(3,)),直接把整个元组转int肯定报错。你需要取元组里的第一个元素,也就是实际的item_ID值。
核心修正点
正确获取最后一个item_ID:
fetchall()返回的是所有查询结果的列表,每个元素是对应行的元组。比如查询item_ID得到的是[(1,), (2,), (3,)],[-1]取到最后一个元组(3,),再用[0]取出里面的数值3。
更高效的方式是直接用SQL取最大的item_ID,避免查询所有数据:cursor.execute('SELECT MAX(item_ID) FROM Items_in_stock') max_id = cursor.fetchone()[0] # 处理空表的情况,如果max_id是None(表中无数据),就把初始ID设为1 adding_item_ID = max_id + 1 if max_id is not None else 1修复未定义变量问题:
代码里adding_item_ID_int和adding_item_ID2都是未定义的变量,删掉print(adding_item_ID2),并把INSERT语句里的adding_item_ID_int改成adding_item_ID。可选:规范数值类型:
如果item_value是数据库的数值字段,建议把输入转成float或int,避免存字符串到数值字段:adding_item_value = float(input("What would you like the value of the item to be? >>> "))
修正后的完整代码
try: adding_item_name = input("What would you like to name the item to be? >>> ") # 根据数据库字段类型,选择转int或float adding_item_value = float(input("What would you like the value of the item to be? >>> ")) adding_item_quantity = int(input("What would you like the quantity to be? >>> ")) # 查询最大item_ID,更高效 cursor.execute('SELECT MAX(item_ID) FROM Items_in_stock') max_id = cursor.fetchone()[0] # 处理空表场景 adding_item_ID = max_id + 1 if max_id is not None else 1 print(adding_item_ID) cursor.execute( 'INSERT INTO Items_in_stock (item_ID, item_name, item_value, item_quantity) VALUES (?,?,?,?)', (adding_item_ID, adding_item_name, adding_item_value, adding_item_quantity,) ) # 如果数据库需要手动提交事务(如MySQL),记得加上这行 # conn.commit() print("Added item successfully") except Exception as e: print(str(e)) print("Unable to add item")
额外建议
最好让数据库自动生成item_ID(比如设置为自增主键),比如MySQL里设置item_ID INT AUTO_INCREMENT PRIMARY KEY,插入时不用传item_ID字段,数据库会自动生成,能避免并发添加时出现重复ID的问题。
内容的提问来源于stack exchange,提问作者Jeremy Panthier
相关产品推荐
相关产品推荐

