Dbt 有一个配置设置sql_header
,表面上是用于在运行时将 udf 注入模型语句。不幸的是,似乎不支持调用宏。此外,临时实现不受此设置的影响。sql_footer
我在sql 语句的末尾创建了一个名为 but 的设置,并且具有类似的限制。
除了注释块之外,是否可以合理地调整 query_header代码以支持注入原始 sql,例如通过向配置字典添加执行布尔值?
dbt/core/dbt/adapters/base/query_headers.py
def add(self, sql: str) -> str:
if not self.query_comment:
return sql
if self.append:
# replace last ';' with '<comment>;'
sql = sql.rstrip()
if sql[-1] == ';':
sql = sql[:-1]
return '{}\n{} {} {};'.format(sql, block_start, self.query_comment.strip(), block_end)
vs
return '{}\n/* {} */;'.format(sql, self.query_comment.strip())
我理解将 sql 注入 sql 的任何沉默,我的用例是模型开发人员永远不会接触到的非常系统级配置,并且理想情况下将通过 cicd 进行控制。我们的 etl 有不同的实现,根据环境需要不同的暂存过滤器。我宁愿注入一两行 sql 而不必为每个实现复制模型。例如:
dbt_project.yml
models:
- foo:
query_comment:
comment: "{{ var('ops_filter', default_filter()) }}"
executable: True
append: True
stg_foo.sql
with source as (Select *
from {{ source('foo') }})
select id
from source
### inject footer sql here ###
where $date_param between dbt_valid_to and dbt_valid_from
|where 1=1
|where dms_updated_at::date=$date_param```
Any advice is appreciated, love this project!