Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在dbt中将变量解析为源引用?_Sql_Jinja2_Snowflake Cloud Data Platform_Dbt - Fatal编程技术网

Sql 如何在dbt中将变量解析为源引用?

Sql 如何在dbt中将变量解析为源引用?,sql,jinja2,snowflake-cloud-data-platform,dbt,Sql,Jinja2,Snowflake Cloud Data Platform,Dbt,我正在构建一个模型,在此模型中,我根据查询结果动态引用表名和模式名 {%- set query %} select * from master_data.event_metadata where game='{{game_name}}' {% endset -%} {%- set results = run_query(query) -%} {%- if execute %} {%- set record = results.row

我正在构建一个模型,在此模型中,我根据查询结果动态引用表名和模式名

    {%- set query %}
        select * from master_data.event_metadata where game='{{game_name}}'
    {% endset -%}
    {%- set results = run_query(query) -%}
    {%- if execute %}
        {%- set record = results.rows[0] -%}
    {% else %}
        {%- set record = [] -%}
    {% endif -%}
其中两个值位于
record.SCHEMA\u NAME
record.TABLE\u NAME
中。我可以用

select
    *
from
    {{record.SCHEMA_NAME}}.{{record.TABLE_NAME}}
select
    *
from
    {{ source(record.SCHEMA_NAME, record.TABLE_NAME) }}
但是我更愿意使用
source()
函数,这样我的文档和DAG就会干净。如何将
record.SCHEMA\u NAME
record.TABLE\u NAME
解析为字符串参数。我需要一些类似的东西

select
    *
from
    {{record.SCHEMA_NAME}}.{{record.TABLE_NAME}}
select
    *
from
    {{ source(record.SCHEMA_NAME, record.TABLE_NAME) }}
当我尝试运行上述程序时,我得到以下错误:

Server error: Compilation Error in rpc request (from remote system)
The source name (first) argument to source() must be a string, got <class 'jinja2.runtime.Undefined'>
服务器错误:rpc请求中的编译错误(来自远程系统)
source()的source name(first)参数必须是字符串,get

我认为您需要先将这两个对象转换为它们的字符串表示形式,然后再将它们传递到

试试这个

select
    *
from
    {{ source(record.SCHEMA_NAME|string, record.TABLE_NAME||string) }}

您可能已经找到了解决方法或解决方案,但以防其他人遇到同样的情况

要将值转换为字符串,可以使用
|字符串
。例如:

record.SCHEMA_NAME|string
record.TABLE_NAME|string
因此,您的查询如下所示:

select * from {{ source(record.SCHEMA_NAME|string|lower, record.TABLE_NAME|string|lower) }}
请注意,根据查询的输出和定义源文件的方式,您可能需要
lower
upper
您的值才能与源文件匹配

问题 您的
记录
变量是执行的结果(
run\u query(query)
)。当您执行
dbt编译/运行时
dbt将执行一系列操作,如读取项目的所有文件,生成一个“manifest.json”文件,并使用
ref
/
源代码
生成DAG,因此此时,不执行SQL,换句话说,
execute==False

在您的示例中,即使您执行了
record.SCHEMA_NAME | string
,您也将无法检索该变量的值,因为没有执行任何操作,并且由于您执行了
,如果没有执行,那么record=[]
,您将得到该消息
。。。取决于未找到的名为“.”的源,因为此时,
记录
为空

一种解决方法是将模型的查询包装在
if execute
块中,如下所示:

select * from {{ source(record.SCHEMA_NAME|string|lower, record.TABLE_NAME|string|lower) }}
{%if execute%}
从{{source(record.TABLE|SCHEMA | string | lower,record.TABLE | NAME | string | lower)}中选择*
{%endif%}
使用这种方法,您将能够动态地设置模型的源

但不幸的是,这不会像您预期的那样工作,因为它不会为该模型生成DAG。使用
if execute
块包装模型的查询将阻止dbt为模型生成DAG

最后,这与您第一次尝试在不使用
source
函数的情况下声明
schema
table
相同

有关更多详细信息,您可以查看有关执行模式的dbt文档:

我也有同样的问题!我尝试了此操作,但在
Rpc“Rpc”下面出现了此错误。我的\u new\u project.request(来自远程系统)依赖于名为“.”的源,但找不到该源
。我知道这些变量中肯定有值,因为当我执行
{{record.SCHEMA{u NAME}}.{{record.TABLE{u NAME}}
it work时,Andrei,你还在寻找这个问题的答案吗?我能知道您是否已经在source.yml文件中声明了这个特定的表吗?是的,我已经在
source.yml
中声明了该表。当硬编码名称(如
{{source('schema_name','table_name')}}
时,它确实起作用。