dbt 不少资源类型都支持config macro 的使用,可以进行灵活的配置管理

参考使用

内部处理

配置
模型的执行物化策略
{{ config(
    materialized="<materialization_name>",
    sql_header="<string>"
) }}
快照的

{{ config(
    target_schema="<string>",
    target_database="<string>",
    unique_key="<column_name_or_expression>",
    strategy="timestamp" | "check",
    updated_at="<column_name>",
    check_cols=["<column_name>"] | "all"
) }}
获取config
{% materialization incremental, default -%}
  {%- set unique_key = config.get('unique_key') -%}
  ...
提供的方法
get,require,

实际上就是一个类,实现了一些方法

参考配置
class Config(Protocol):
    def __init__(self, model, context_config: Optional[ContextConfig]):
        ...
 
# 这个是解析的,当然还有不少其他的实现
# Implementation of "config(..)" calls in models
class ParseConfigObject(Config):
    def __init__(self, model, context_config: Optional[ContextConfig]):
        self.model = model
        self.context_config = context_config
 
    def _transform_config(self, config):
        for oldkey in ("pre_hook", "post_hook"):
            if oldkey in config:
                newkey = oldkey.replace("_", "-")
                if newkey in config:
                    raise ConflictingConfigKeysError(oldkey, newkey, node=self.model)
                config[newkey] = config.pop(oldkey)
        return config
 
    def __call__(self, *args, **kwargs):
        if len(args) == 1 and len(kwargs) == 0:
            opts = args[0]
        elif len(args) == 0 and len(kwargs) > 0:
            opts = kwargs
        else:
            raise InlineModelConfigError(node=self.model)
 
        opts = self._transform_config(opts)
 
        # it's ok to have a parse context with no context config, but you must
        # not call it!
        if self.context_config is None:
            raise DbtRuntimeError("At parse time, did not receive a context config")
        self.context_config.add_config_call(opts)
        return ""
 
    def set(self, name, value):
        return self.__call__({name: value})
 
    def require(self, name, validator=None):
        return ""
 
    def get(self, name, default=None, validator=None):
        return ""
 
    def persist_relation_docs(self) -> bool:
        return False
 
    def persist_column_docs(self) -> bool:
        return False
上下文处理
render_with_context 会使用_context_for ,_context_for会调用generate_parser_model_context 会使用到config
def generate_parser_model_context(
    model: ManifestNode,
    config: RuntimeConfig,
    manifest: Manifest,
    context_config: ContextConfig,
) -> Dict[str, Any]:
    # The __init__ method of ModelContext also initializes
    # a ManifestContext object which creates a MacroNamespaceBuilder
    # which adds every macro in the Manifest.
    ctx = ModelContext(model, config, manifest, ParseProvider(), context_config)
    # The 'to_dict' method in ManifestContext moves all of the macro names
    # in the macro 'namespace' up to top level keys
    return ctx.to_dict()

说明

以上是关于dbt config的简单说明,对于详细使用可以参考官方文档

参考资料

https://docs.getdbt.com/reference/data-test-configs
https://docs.getdbt.com/reference/dbt-jinja-functions/config