Перейти к основному содержимому

Об объекте adapter

Ваша база данных взаимодействует с dbt с помощью внутреннего объекта адаптера базы данных. Например, BaseAdapter и SnowflakeAdapter. Jinja объект adapter является оберткой вокруг этого внутреннего объекта адаптера базы данных.

adapter предоставляет возможность вызывать методы адаптера этого внутреннего класса через:

  • {% do adapter.<имя метода> %} -- вызов внутреннего метода адаптера
  • {{ adapter.<имя метода> }} -- вызов внутреннего метода адаптера и захват его возвращаемого значения для использования в материализации или других макросах

Например, методы адаптера ниже будут переведены в конкретные SQL-запросы в зависимости от типа адаптера, который использует ваш проект:

Устаревшие функции адаптера

Следующие функции адаптера устарели и будут удалены в будущих версиях.

dispatch

Перемещено на отдельную страницу: dispatch

get_missing_columns

Аргументы:

Возвращает список Columns, который является разницей между столбцами в from_table и столбцами в to_table, т.е. (set(from_relation.columns) - set(to_table.columns)). Полезно для обнаружения новых столбцов в исходной .

Использование:

models/example.sql
{%- 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)) для поддержки операторов вставки.

Использование:

example.sql
{% 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, если отношение не существует.

Использование:

example.sql

{%- 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, если отношение не существует.

Использование:

example.sql

{% 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 в .

Использование:

example.sql

{%- set columns = adapter.get_columns_in_relation(this) -%}

{% for column in columns %}
{{ log("Column: " ~ column, info=true) }}
{% endfor %}

create_schema

Аргументы:

  • relation: Объект отношения с базой данных и схемой для создания. Любой идентификатор на отношении будет проигнорирован.

Создает схему (или эквивалент) в целевой базе данных. Если целевая схема уже существует, то этот метод не выполняет никаких действий.

Использование:

example.sql

{% do adapter.create_schema(api.Relation.create(database=target.database, schema="my_schema")) %}

drop_schema

Аргументы:

  • relation: Объект отношения с базой данных и схемой для удаления. Любой идентификатор на отношении будет проигнорирован.

Удаляет схему (или эквивалент) в целевой базе данных. Если целевая схема не существует, то этот метод не выполняет никаких действий. Конкретная реализация зависит от адаптера, но адаптеры должны реализовывать каскадное удаление, так что объекты в схеме также удаляются. Примечание: этот метод адаптера является разрушительным, поэтому используйте его с осторожностью!

Использование:

example.sql

{% do adapter.drop_schema(api.Relation.create(database=target.database, schema="my_schema")) %}

drop_relation

Аргументы:

  • relation: Отношение для удаления

Удаляет отношение в базе данных. Если целевое отношение не существует, то этот метод не выполняет никаких действий. Конкретная реализация зависит от адаптера, но адаптеры должны реализовывать каскадное удаление, так что связанные представления ниже по потоку от удаленного отношения также удаляются. Примечание: этот метод адаптера является разрушительным, поэтому используйте его с осторожностью!

Метод drop_relation удалит указанное отношение из кэша отношений dbt.

Использование:

example.sql

{% do adapter.drop_relation(this) %}

rename_relation

Аргументы:

  • from_relation: Отношение для переименования
  • to_relation: Целевое отношение для переименования from_relation

Переименовывает отношение в базе данных. Метод rename_relation переименует указанное отношение в кэше отношений dbt.

Использование:

example.sql

{%- 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 в правильные кавычки для адаптера при экранировании зарезервированных имен столбцов и т.д.

Использование:

example.sql
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 в .

models/example.sql
{% 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.

models/example.sql
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 пакетах с поддержкой нескольких баз данных.

Использование:

macros/concat.sql
{% 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 %}
0