SQLite3 fetchall()未获取全部数据:4行数据仅返回2行的技术问询
问题原因及解决办法
核心原因:游标被多次调用fetchone()消耗了前两行数据
你的代码里先后调用了两次ptr.fetchone(),而SQLite游标是单向移动的,每次调用都会取出一行并将游标移动到下一行:
- 第一次
print(f'whatcha got: {ptr.fetchone()}')取出了第一行数据('mInput1', 'min1_', 1, 0.1),游标移动到第二行开头。 - 第二次
if ptr.fetchone():取出了第二行数据('mInput2', 'min2_', 1, 0.1),游标移动到第三行开头。
最后调用ptr.fetchall()时,只能获取游标当前位置之后的剩余两行数据,也就是第三、第四行。
额外说明:ptr.rowcount返回-1是正常行为
SQLite的游标rowcount属性仅对INSERT/UPDATE/DELETE这类修改数据的语句有效,会返回受影响的行数;对于SELECT查询,它固定返回-1,不能用来判断查询结果的总行数。
修正方案
方案1:直接获取所有数据
如果不需要单独查看第一行,直接调用一次fetchall()即可:
db = sqlite3.connect(dbLocation) ptr = db.cursor() query = 'SELECT * FROM portSettings;' ptr.execute(query) results = ptr.fetchall() print(f'--------> 共 {len(results)} 条结果. voila! ↓ --------') print(results)
方案2:保留第一次fetchone()的结果
如果需要先查看第一行再获取全部数据,可将第一行结果保存后与剩余数据合并:
db = sqlite3.connect(dbLocation) ptr = db.cursor() query = 'SELECT * FROM portSettings;' ptr.execute(query) first_row = ptr.fetchone() print(f'whatcha got: {first_row}') if first_row: results = [first_row] + ptr.fetchall() print(f'--------> 共 {len(results)} 条结果. voila! ↓ --------') print(results)
内容的提问来源于stack exchange,提问作者WhiteRau
相关产品推荐
相关产品推荐

