跳转到主要内容
从 blockdb 包导入公开接口。在 Chaintable Notebook 中使用写入和订阅;Function 中可使用允许的读取接口。源码提供完整实现。

普通表

NormalTable(table_id)

table_id 是完整表 ID,返回普通表对象。
先按创建和管理表建立示例表,再按读写数据写入记录。 filter() 和 select() 只收集条件和列,query()、scan() 或 scan_iter() 才真正读取,同一个查询对象可以多次执行。query() 是在线读取,支持排序和分页,始终返回全部列;scan() 用于读取大量记录,不支持排序和分页,但 select() 对它生效。 find() 接受手写的 SQL 条件,不包含 WHERE 关键字,用于列表达式还无法表达的条件。scan() 传入完整语句时按原样执行,FROM 由调用方书写,并用反引号引用完整表 ID;SDK 不会根据对象自动补全。它是 BlockDB 扫描接口,支持的 SQL 范围与分析引擎不同。

条件写入

condition 为 (列名, 模式):IF_LARGER 仅在新值较大时更新已有记录,IF_SMALLER 仅在新值较小时更新;不存在的记录仍会插入。条件列不能是主键,同一批次共用一个条件。 batch_write() 每行需要相同的字段集合。返回成功不保证随后立即读到新数据;批量写入的状态检查见查看异步写任务。

区块事件表与状态表

EventTable(table_id, block_id=None) / StateTable(table_id, block_id=None)

table_id 为表 ID,block_id 指定读取位置。事件表按事件 ID 读取记录;状态表按业务 ID 读取该区块时的状态。省略 block_id 时读取每个 ID 的最新记录,不会退回共识高度;显式指定区块时,服务端检查表的共识高度是否已覆盖该区块。
本例读取最新状态,示例表来自追踪流动性池储备变化。按指定区块读取状态时,表的共识高度须覆盖该区块,详见工作原理。 get_block_rows() 的 None 和 [] 含义不同:[] 表示该区块已处理且没有记录,None 表示链上没有该区块,或该表还没处理到这个高度。 逐块 write() 由服务端补齐区块字段;batch_write() 整体替换一个区块包,每行必须携带 block_id、block_height 和 block_timestamp。区块包编号不是区块高度。

时间表

TimeTable(table_id, time_at=None)

time_at 指定读取时刻;省略时读取最新值。可使用 RFC3339 时间字符串或 Python datetime,无时区时间按 UTC 解释。
write() 使用方法参数的时间,不使用行内 time_at;多时刻回填使用 batch_write(),每行只包含固定的三个字段。 时间分桶由服务端处理,同一桶保留最新时间点,分辨率随数据年龄变化,详见工作原理。

区块订阅

对齐内置在订阅中:tables 中每张表都写入该高度、且 requires 中每张表的共识高度到达该高度后,listen() 才产生事件。要求互不对齐的表应分别订阅。tables 和 requires 都接受单个表对象、表 ID 或它们的列表。 lookback 是回放的区块数,含链头本身:100 从链头往前第 100 个区块开始,0 只接收新事件。服务端按每张表所在链解析该窗口,超出回放窗口的请求会被拒绝,历史数据仍需回填。 readiness 默认 RowsReady,区块的记录可读时就计入对齐;Committed 只接受已提交的通知。依赖表始终按已提交判定。完整运行示例见订阅区块事件。

筛选表达式和类型

Column 和 filter() 构造 Pipeline 触发源的筛选表达式;逻辑组合使用带括号的 &、|,集合条件使用 in_() 和 not_in(),接在 filter() 后的 dedup(*cols) 按列去重。C 是列的简写,C.name 等价于 Column('name')。 筛选作用于源记录的原始值:UINT256 列按十进制字符串比较,常量需写成字符串,例如 Column('amount') == '1500000';大小比较按字符串顺序而非数值大小。 filter() 会遮蔽内置的 filter,因此从 blockdb.operator 导入;表上的 filter() 是查询方法,不需要导入。不要把筛选表达式传给要求 SQL 条件字符串的 find()。 LogicalType 提供类型名称,restore_value(logical_type, raw) 按元数据把原始值恢复为 Python 值。例如 restore_value('UINT256', '1500000') 保留十进制字符串,计算时再使用 int()。类型说明见数据类型。