使用python从sql文件中获取别名



我有一个dbt项目。一些sql文件有使用jinja的别名(见下文)。我想使用python来获取特定文件的别名(即,如果没有别名,使用文件名,如果有别名则使用该别名)。理论上,我可以在文件中查找字符串,试图找到"别名"。但我觉得这很容易出错,因为别名这个词有时会出现在一些文件的其他上下文中,而且它的确切写法在文件之间是不同的。是否有一些简单的方法可以专门查看jinja并获得别名值?

示例文件:

{{
config(alias='my_alias')
}}
(some sql query...)

在dbt项目中(可能是模型文件中的宏或jinja),您可以访问graph上下文变量,它是一个字典,包含dbt中定义的所有资源的所有配置和属性。如果需要访问当前型号的graph节点,可以使用model。因此,要从模型sql本身访问模型的别名,可以这样做:

{{
config(alias='my_alias')
}}
select
'{{ model.config.alias if execute else "" }}' as config_alias,
'{{ model.alias if execute else "" }}' as resolved_alias

如果您想编写一个独立于dbt执行的Python脚本,您可以读取dbt的manifest.json工件。请参阅文档中的清单。大多数dbt命令生成(或更新)清单,默认情况下,清单被写入dbt项目目录中的target目录。

模型在一个名为nodes的键下,并通过它们的完全限定资源名称model.my_project.my_model来键化:

import json
with open("target/manifest.json") as f:
manifest = json.load(f)
config_alias = manifest["nodes"]["model.jaffle_shop.orders"]["config"]["alias"]
print(config_alias)
resolved_alias = manifest["nodes"]["model.jaffle_shop.orders"]["alias"]
print(resolved_alias)

注意config_alias将是None,除非为该模型显式配置别名;resolved_alias永远不会是None,因为如果没有配置别名,它将被解析为模型的名称。

最新更新