如何修正SQLite查询结果转Python列表时的索引越界问题?
解决SQLite查询结果列表索引越界问题
首先咱们来分析下你代码里的问题:你修改后的函数里用了data.append(cursor.fetchall()),但fetchall()本身返回的是所有匹配行组成的元组列表——哪怕只查到一行数据,它也是[(Alpha值, beta值, gamma值, number值)]这样的结构。当你把这个结果append到data里,data就变成了嵌套列表,比如[[(a,b,c,n)]]。这时候你尝试访问data[1],自然会抛出索引越界,因为整个data列表只有一个元素(索引0)。
接下来给你两种针对性的解决方案:
情况1:number是唯一标识,只会返回一行数据
这种情况用fetchone()更合适,它直接返回单个元组(查询到结果时)或者None。我们可以提取元组里的前三个元素(Alpha、beta、gamma)存入列表:
import sqlite3 def viewdata(number): data = [] conn = sqlite3.connect("alpha.db") cursor = conn.cursor() # 去掉SQL语句多余的括号,写法更简洁 cursor.execute("SELECT Alpha, beta, gamma, number FROM alphanum WHERE number=?", (number,)) result = cursor.fetchone() # 获取单条结果,返回元组或None if result: # 提取前三个元素,添加到data列表中 data.extend(result[:3]) conn.close() return data
调用这个函数后,如果查到数据,data会是[Alpha值, beta值, gamma值],你可以通过data[0]、data[1]、data[2]分别访问对应的值。
情况2:number可能匹配多行数据
如果需要把每一行的Alpha、beta、gamma都单独存为子列表,可以遍历fetchall()的结果,逐个提取:
import sqlite3 def viewdata(number): data = [] conn = sqlite3.connect("alpha.db") cursor = conn.cursor() cursor.execute("SELECT Alpha, beta, gamma, number FROM alphanum WHERE number=?", (number,)) results = cursor.fetchall() for row in results: # 把每行的前三个元素转为列表,添加到data中 data.append(list(row[:3])) conn.close() return data
这时候data的结构会是[[Alpha1, beta1, gamma1], [Alpha2, beta2, gamma2], ...],你可以通过data[i][0]、data[i][1]、data[i][2]访问第i行的对应值。
内容的提问来源于stack exchange,提问作者Python_newbie
相关产品推荐
相关产品推荐

