GridDB Python客户端中,fetch(False)的RowSet迭代后Query对象是否不可复用?
GridDB Python客户端Query对象在fetch(False)后的生命周期说明
是的,GridDB Python客户端的Query对象在其返回的RowSet被完全迭代后,确实会被设计为不可复用/已耗尽状态,无法通过再次调用fetch(False)获取新的结果集。
核心原因
GridDB Python客户端的底层实现中,Query对象与单次查询的上下文(包括查询游标)绑定。当你第一次调用fetch(False)并将返回的RowSet完全迭代(比如用list(rs1)遍历所有结果)后,底层的查询游标已经移动到结果集的末尾,且客户端没有提供重置游标或重新执行查询的机制。此时再次调用同一Query对象的fetch(False),会直接返回空的RowSet。
结合测试案例验证
你的测试流程完全印证了这一特性:
- 首次执行查询:
query = container.query("SELECT *") rs1 = query.fetch(False) rows1 = list(rs1) print(rows1) # 输出 [(1, 10.5), (2, 20.0)]
此时RowSet被完全迭代,Query对象的查询上下文已耗尽。
- 复用同一Query对象再次查询:
rs2 = query.fetch(False) rows2 = list(rs2) print(rows2) # 输出 []
因为原Query的查询游标已走到末尾,无法再获取新数据。
- 验证数据未丢失且新Query有效:
print(container.get(1)) # 输出 (1, 10.5),数据仍存在 query = container.query("SELECT *") # 创建新Query对象 rs3 = query.fetch(False) print(list(rs3)) # 再次输出完整结果集
环境一致性
该行为在以下环境中均会复现:
- GridDB CE 5.x
- GridDB Cloud
- Python 3.10
正确做法
如果需要重复执行同一查询逻辑,必须每次调用container.query()创建新的Query对象,而非复用已耗尽的旧对象。
内容的提问来源于stack exchange,提问作者Klc
相关产品推荐
相关产品推荐

