从版本 1.5 开始,可以直接从 python 脚本中调用 dbt,例如:
from dbt.cli.main import dbtRunner, dbtRunnerResult
# initialize
dbt = dbtRunner()
# create CLI args as a list of strings
cli_args = ["run-operation", "get_something_macro"]
# run the command
res: dbtRunnerResult = dbt.invoke(cli_args)
# inspect the results
for r in res.result:
print(f"{r}")
参见: https://docs.getdbt.com/reference/programmatic-in Vocations
假设我有一个简单的宏,可以返回一些内容,例如:
{% macro get_current_catalog() %}
{{ return(target.catalog) }}
{% endmacro %}
如何将返回值输入到python中?
到目前为止我唯一的想法是在宏中使用
print("...")
或 log("...", info=True)
并捕获标准输出。但我认为必须有更好的方法......
也许你们中的一些人/女孩知道。
你不能在Python模型中直接使用宏,因为你不能在Python模型中使用Jinja。
此问题的解决方法是在 yml 中调用宏:
models:
- name: model_my
config:
materialized: incremental
tags: [ 'python' ]
current_catalog: '{{ get_current_catalog() }}'
def model(dbt, session):
print(dbt.config.get("current_catalog"))
请参阅此问题以供参考