Об объекте adapter
Ваша база данных взаимодействует с dbt с помощью внутреннего объекта адаптера базы данных. Например, BaseAdapter и SnowflakeAdapter. Jinja объект adapter
является оберткой вокруг этого внутреннего объекта адаптера базы данных.
adapter
предоставляет возможность вызывать методы адаптера этого внутреннего класса через:
{% do adapter.<имя метода> %}
-- вызов внутреннего метода адаптера{{ adapter.<имя метода> }}
-- вызов внутреннего метода адаптера и захват его возвращаемого значения для использования в материализации или других макросах
Например, методы адаптера ниже будут переведены в конкретные SQL-запросы в зависимости от типа адаптера, который использует ваш проект:
- adapter.dispatch
- adapter.get_missing_columns
- adapter.expand_target_column_types
- adapter.get_relation или load_relation
- adapter.get_columns_in_relation
- adapter.create_schema
- adapter.drop_schema
- adapter.drop_relation
- adapter.rename_relation
- adapter.quote
Устаревшие функции адаптера
Следующие функции адаптера устарели и будут удалены в будущих версиях.
- adapter.get_columns_in_table (устарело)
- adapter.already_exists (устарело)
- adapter_macro (устарело)
dispatch
Перемещено на отдельную страницу: dispatch
get_missing_columns
Аргументы:
Возвращает список Columns, который является разницей между столбцами в from_table
и столбцами в to_table
, т.е. (set(from_relation.columns) - set(to_table.columns)
). Полезно для обнаружения новых столбцов в исходной .
Использование:
{%- set target_relation = api.Relation.create(
database='database_name',
schema='schema_name',
identifier='table_name') -%}
{% for col in adapter.get_missing_columns(target_relation, this) %}
alter table {{this}} add column "{{col.name}}" {{col.data_type}};
{% endfor %}
expand_target_column_types
Аргументы:
from_relation
: Исходная Relation для использования в качестве шаблонаto_relation
: Relation для изменения
Расширяет типы столбцов to_relation
, чтобы они соответствовали схеме from_relation
. Расширение столбцов ограничено строковыми и числовыми типа ми в поддерживаемых базах данных. Типичное использование включает расширение типов столбцов (например, с varchar(16)
до varchar(32)
) для поддержки операторов вставки.
Использование:
{% set tmp_relation = adapter.get_relation(...) %}
{% set target_relation = adapter.get_relation(...) %}
{% do adapter.expand_target_column_types(tmp_relation, target_relation) %}
get_relation
Аргументы:
database
: База данных для получения отношенияschema
: Схема для получения отношенияidentifier
: Идентификатор для получения отношения
Возвращает кэшированный объект Relation, идентифицированный database.schema.identifier
, переданным методу, или None
, если отношение не существует.
Использование:
{%- set source_relation = adapter.get_relation(
database="analytics",
schema="dbt_drew",
identifier="orders") -%}
{{ log("Source Relation: " ~ source_relation, info=true) }}
load_relation
Аргументы:
relation
: Relation для загрузки
Удобная обертка для get_relation. Возвращает кэшированную версию объекта Relation, или None
, если отношение не существует.
Использование:
{% set relation_exists = load_relation(ref('my_model')) is not none %}
{% if relation_exists %}
{{ log("my_model has already been built", info=true) }}
{% else %}
{{ log("my_model doesn't exist in the warehouse. Maybe it was dropped?", info=true) }}
{% endif %}
get_columns_in_relation
Аргументы:
relation
: Relation для поиска столбцов
Возвращает список Columns в .
Использование:
{%- set columns = adapter.get_columns_in_relation(this) -%}
{% for column in columns %}
{{ log("Column: " ~ column, info=true) }}
{% endfor %}
create_schema
Аргументы:
relation
: Объект отношения с базой данных и схемой для создания. Любой идентификатор на отношении будет проигнорирован.
Создает схему (или эквивалент) в целевой базе данных. Если целевая схема уже существует, то этот метод не выполняет никаких действий.
Использование:
{% do adapter.create_schema(api.Relation.create(database=target.database, schema="my_schema")) %}
drop_schema
Аргументы:
relation
: Объект отношения с базой данных и схемой для удаления. Любой идентификатор на отношении будет проигнорирован.
Удаляет схему (или эквивалент) в целевой базе данных. Если целевая схема не существует, то этот метод не выполняет никаких действий. Конкретная реализация зависит от адаптера, но адаптеры должны реализовывать каскадное удаление, так что объекты в схеме также удаляются. Примечание: этот метод адаптера является разрушительным, поэтому используйте его с осторожностью!
Использование:
{% do adapter.drop_schema(api.Relation.create(database=target.database, schema="my_schema")) %}
drop_relation
Аргументы:
relation
: Отношение для удаления
Удаляет отношение в базе данных. Если целевое отношение не существует, то этот метод не выполняет никаких действий. Конкретная реализация зависит от адаптера, но адаптеры должны реализовывать каскадное удаление, так что связанные представления ниже по потоку от удаленного отношения также удаляются. Примечание: этот метод адаптера является разрушительным, поэтому используйте его с осторожностью!
Метод drop_relation
удалит указанное отношение из кэша отношений dbt.
Использование:
{% do adapter.drop_relation(this) %}
rename_relation
Аргументы:
from_relation
: Отношение для переименованияto_relation
: Целевое отношение для переименованияfrom_relation
Переименовывает отношение в базе данных. Метод rename_relation
переименует указанное отношение в кэше отношений dbt.
Использование:
{%- set old_relation = adapter.get_relation(
database=this.database,
schema=this.schema,
identifier=this.identifier) -%}
{%- set backup_relation = adapter.get_relation(
database=this.database,
schema=this.schema,
identifier=this.identifier ~ "__dbt_backup") -%}
{% do adapter.rename_relation(old_relation, backup_relation) %}
quote
Аргументы:
identifier
: Строка для заключения в кавычки
Заключает identifier
в правильные кавычки для адаптера при экранировании зарезервированных имен столбцов и т.д.
Использование:
select
'abc' as {{ adapter.quote('table_name') }},
'def' as {{ adapter.quote('group by') }}
get_columns_in_table
Этот метод устарел и будет удален в будущих версиях. Пожалуйста, используйте get_columns_in_relation вместо него.
Аргументы:
schema_name
: Схема для проверкиtable_name
: (или представление), из которого нужно выбрать столбцы
Возвращает список Columns в .
{% set dest_columns = adapter.get_columns_in_table(schema, identifier) %}
{% set dest_cols_csv = dest_columns | map(attribute='quoted') | join(', ') %}
insert into {{ this }} ({{ dest_cols_csv }}) (
select {{ dest_cols_csv }}
from {{ref('another_table')}}
);
already_exists
Этот метод устарел и будет удален в будущих версиях. Пожалуйста, используйте get_relation вместо него.
Аргументы:
schema
: Схема для проверкиtable
: Отношение для поиска
Возвращает true, если отношение с именем table
существует в схеме schema
, иначе false.
select * from {{ref('raw_table')}}
{% if adapter.already_exists(this.schema, this.name) %}
where id > (select max(id) from {{this}})
{% endif %}
adapter_macro
Этот метод устарел и будет удален в будущих версиях. Пожалуйста, используйте adapter.dispatch вместо него.
До версии v0.18.0 dbt поддерживал ограниченную версию функциональности dispatch
через макрос с именем adapter_macro
.
Аргументы:
name
: имя макроса для реализации*args
**kwargs
Находит подходящую для адаптера версию именованного макроса и реализует его с предоставленными позиционными и/или именованными аргументами. Это наиболее актуально для макросов в open-source пакетах с поддержкой нескольких баз данных.
Использование:
{% macro concat(fields) -%}
{{ adapter_macro('concat', fields) }}
{%- endmacro %}
{% macro default__concat(fields) -%}
concat({{ fields|join(', ') }})
{%- endmacro %}
{% macro redshift__concat(fields) %}
{{ fields|join(' || ') }}
{% endmacro %}
{% macro snowflake__concat(fields) %}
{{ fields|join(' || ') }}
{% endmacro %}