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

SQLite3 fetchall()未获取全部数据:4行数据仅返回2行的技术问询

问题原因及解决办法

核心原因:游标被多次调用fetchone()消耗了前两行数据

你的代码里先后调用了两次ptr.fetchone(),而SQLite游标是单向移动的,每次调用都会取出一行并将游标移动到下一行:

  1. 第一次print(f'whatcha got: {ptr.fetchone()}')取出了第一行数据('mInput1', 'min1_', 1, 0.1),游标移动到第二行开头。
  2. 第二次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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:03:30