Я проверяю dbt для конкретного варианта использования, и у меня есть следующий вопрос.
Могу ли я применить/использовать аналогичные преобразования ко многим таблицам в каком-то цикле?
Например:
Я хочу сделать следующее для многих таблиц, чтобы вставить недостающие строки в целевую таблицу:
INSERT into stage.<table_name> SELECT * FROM loading.<table_name> EXCEPT SELECT * FROM stage.<table_name>;
Как я могу сделать это в цикле FOR или любым другим способом для всех таблиц?
Спасибо.
вы можете сделать это, но я чувствую, что вы продвигаетесь по маршруту, который не соответствует использованию dbt. да, вы можете использовать цикл. однако вам следует рассмотреть возможность использования инкрементной модели, а не вставки, которую вы предоставляете.
Шаги, которые вы должны предпринять.
вы можете использовать что-то вроде этого макроса для создания списка из вашей таблицы, затем вы должны вызвать этот макрос из макроса, который вы используете для создания кода своей модели.
{% macro generate_tables_set() %}
{% set tables_sql %}
select table_name
from my_table_of_tables
{% endset %}
{%do return(run_query(tables_sql)) %}
{% endmacro %}
Вот пример макроса, который использует этот список
{% macro do_something() %}
{% set sql_template %}
your sql goes here, use ==TABLE== to denote your table
e.g. select * from stage.==TABLE==
{% endset %}
{%set this_sql_list =[] %}
{% for this_name in generate_tables_set()%}
{% set this_sql = this_sql|replace("==TABLE= = ",this_name)%}
{% do this_sql_list.append(this_sql) %}
{% endfor %}
{{this_sql_list|join(" UNION ALL ")}}
{% endmacro %}