调用Dune结果API拿到rows后,很多脚本就直接写CSV并结束。若结果超过单页限制,这种脚本会悄悄漏页;若结果超过Dune内部存储上限并显式允许partial,拿到的则是被截断的数据。可靠采集必须把最近一次执行、分页和超大结果截断分开核对。
第一页先回答三个问题
Dune Get Latest Query Result返回某查询最近一次执行的结果和execution_id,原始GET端点本身不会触发新执行;当前运行中的任务需按对应execution_id查询状态。 第一,读取的是query的最近一次执行结果,还是指定execution_id的结果;第二,本页返回多少行、当前可返回结果集有多少行;第三,是否存在next_offset或next_uri。只有rows非空不能回答这三个问题。
请求日志至少记录query_id、execution_id、API端点、limit、offset、筛选和排序参数。API密钥不进入日志。若同一query重新执行,execution_id会变化,不能把两次执行的页面拼在一起。
一个不会悄悄漏页的循环
从offset 0开始,请求固定limit;把本页行写入临时分片;读取next_uri或next_offset;没有下一页时停止;最后把累计行数与metadata.total_row_count核对。若不一致,保留分片并标记失败,不直接发布统计结果。
| 检查点 | 通过条件 | 失败处理 |
|---|---|---|
| 执行身份 | 每页execution_id一致 | 丢弃混合批次 |
| 页游标 | 单调推进且不重复 | 停止并报警 |
| 行数 | 累计与总数一致 | 重拉或查过期 |
| 字段 | 列名与类型稳定 | 版本化解析器 |
row_count是当前响应页的行数,total_row_count是当前可返回结果集的总行数;若结果因内部大小上限被截断,该值不能证明原始SQL产出完整无缺。 Get Latest Query Result的原始GET端点不会启动新执行;它返回最近一次执行的execution_id和结果。若另一个任务正在运行,应按那个execution_id查询状态,不能从latest结果是否partial来判断。结果过期后,旧next_uri可能不再可用,抓取任务应保存访问时间。
next_uri和next_offset怎样选
next_offset与next_uri用于分页;offset/limit与随机sampling参数互斥。 next_uri是服务端给出的完整下一页地址,next_offset是可用于构造下一请求的偏移。优先遵循当前SDK或官方文档的推荐,不自行修改next_uri中的参数。使用offset时,必须保持limit、筛选和排序不变。
游标推进后得到空页不一定是HTTP错误。offset超过总行数可能返回空结果;此时检查total_row_count与上一页游标。若在预期范围内突然空页,应记录响应与执行状态,不要把空页自动当结束。
partial为何不是执行进度预览
超过内部结果大小上限时结果可能被截断,只有显式允许partial results才会取回部分数据;部分数据不能声称完整。 这里的partial表示结果超过内部大小上限后在存储中被截断,并且调用方显式设置allow_partial_results才取回可用部分。它不是正在执行的查询实时吐出的进度页,也不能据此推断任务还在运行。
数据管道应把truncated-partial与complete存入不同状态,并在标题或元数据中标明“结果被大小上限截断”。禁止一个定时任务把较新的截断结果覆盖较旧但完整的正式数据;可先落入临时表,只有完整性核验通过才交换到发布表。
sampling不能和普通分页混为一谈
官方分页文档对offset、limit和sampling参数有组合边界。抽样返回的是估计或子集,不应通过不断翻页伪装成全量。若使用抽样,报告必须写出方法、参数和随机性;若目标是全量,关闭sampling并完成总行数核验。
排序也影响分页稳定性。查询结果在抓取期间若重新执行或排序键不唯一,offset分页可能出现重复或遗漏。最稳妥的是固定execution_id,并让查询提供确定性排序;必要时用唯一键做跨页去重,但去重不能掩盖源头缺页。
失败恢复不要从零盲重跑
每成功一页就保存分片哈希、offset、行数和下一游标。进程中断后,先验证最后分片,再从下一游标继续。同一执行过期或查询被重新执行时,启动新批次目录,不与旧分片混合。
网络超时后先判断响应是否已经写入分片;相同offset可幂等覆盖同名临时文件。合并阶段检查列结构、页号连续性、累计行数和重复主键,再原子替换正式文件。
发布前的复算记录
记录SQL版本或query_id、execution_id、提交与完成时间、分页参数、总行数、分片数、抓取脚本版本和最终文件SHA-256。若数据用于金额统计,再保存单位、时区、去重逻辑和异常值处理。
Dune是数据接口,不是事实解释的终点。即使分页完整,查询逻辑、标签、覆盖链和过滤规则仍可能有偏差。文章引用数值时应链接查询或方法,并写清下载日期。
完整数据必须能从游标重新走一遍
保存查询ID、执行ID、参数、每页游标、行数和抓取时间,才能复现一次导出。CSV有很多行不等于结果完整,最后一页与总行数核验才是结束条件。
Dune查询结果怎样完整分页?的复查入口
所有时点与定义均以Dune Get Latest Query Result、Dune Execution Object、Dune Results Pagination的公开材料为准。
当前不能越过的事实边界是:API额度、大小上限、保留期和参数名称可能更新;文章示例不包含任何真实API密钥。
相关背景可继续查看Solana地址历史翻页、BlockHeight与Slot、交易量去噪。数据、接口与规则会随时间更新,本文不构成投资、交易或收益建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。