如何让dbt生成的manifest.json中列的data_type属性正常填充
dbt manifest.json 列
data_type属性为空的解决方法 首先明确核心逻辑:dbt的manifest.json是编译阶段生成的静态文件,默认不会主动查询数据库元数据,所以自带的列属性里data_type默认都是null,只有你显式配置了对应值才会填充。而catalog.json是dbt和数据库交互后生成的元数据文件,所以会带有正确的data_type值。
解决方法
方法1:手动在schema.yml中配置data_type(静态方案)
直接在模型对应的schema配置文件中,给每个列显式声明data_type属性,示例配置如下:
models: - name: your_model_name columns: - name: id data_type: bigint - name: create_time data_type: timestamp without time zone - name: amount data_type: numeric(18,2)
配置完成后执行dbt compile重新生成manifest.json,文件中对应列的data_type就会填充你声明的取值。
方法2:自动同步catalog.json的data_type到manifest(动态方案)
如果不想手动维护每个列的类型,可以通过自动同步的方式实现:
- 首先执行
dbt run --generate-catalog或者dbt docs generate,生成带有正确data_type的catalog.json文件 - 编写自定义脚本读取catalog.json中的模型列和对应
data_type映射,批量写入到对应模型的schema.yml配置文件中 - 重新执行
dbt compile生成manifest.json,即可自动填充所有列的data_type属性
如果需要频繁更新,可以把同步脚本配置为dbt的pre-compile hook,每次编译前自动同步,不需要人工介入。
注意事项
- dbt Core 1.3及以上版本优化了
data_type的传递逻辑,如果你使用的是更早的版本,建议先升级到稳定新版本避免兼容问题 - 如果模型列有频繁变更,优先使用动态同步方案,降低手动维护成本
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

