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

Настройка кавычек в проектах

dbt_project.yml
quoting:
database: true | false
schema: true | false
identifier: true | false
snowflake_ignore_case: true | false # Fusion-only config. Aligns with Snowflake's session parameter QUOTED_IDENTIFIERS_IGNORE_CASE behavior.
# Ignored by dbt Core and other adapters.

Definition

При желании вы можете включить квотирование (quoting) в проекте dbt, чтобы управлять тем, будет ли dbt оборачивать имена баз данных, схем или идентификаторов в кавычки при генерации SQL. dbt использует эту настройку в следующих случаях:

  • При создании отношений (например, таблиц или представлений)
  • При разрешении функции ref() в прямую ссылку на отношение
Терминология BigQuery

Обратите внимание, что для конфигурации кавычек в BigQuery здесь следует использовать database и schema, хотя эти настройки будут применяться к именам project и dataset соответственно.

Значение по умолчанию

Значения по умолчанию зависят от базы данных.

Для большинства адаптеров кавычки по умолчанию установлены в true.

Почему? Работать с SELECT одинаково просто как с отношениями, использующими идентификаторы в кавычках, так и без них. Кавычки позволяют использовать зарезервированные слова и специальные символы в именах идентификаторов, однако мы рекомендуем по возможности избегать использования зарезервированных слов и специальных символов в идентификаторах.

dbt_project.yml
quoting:
database: true
schema: true
identifier: true

Примеры

Установите quoting в значение false для проекта:

dbt_project.yml
quoting:
database: false
schema: false
identifier: false
snowflake_ignore_case: false # Fusion-only config. Aligns with Snowflake's session parameter QUOTED_IDENTIFIERS_IGNORE_CASE behavior.
# Ignored by dbt Core and other adapters.

dbt затем создаст связи без кавычек:

create table analytics.dbt_alice.dim_customers

Рекомендации

Snowflake

Если вы используете Snowflake, мы рекомендуем:

  • Установить все параметры quoting в значение False в вашем dbt_project.yml, чтобы избежать лишнего экранирования (quoting) имён моделей и колонок и снизить риск проблем с чувствительностью к регистру.

    • Установка всех параметров quoting в False также означает, что вы не сможете использовать зарезервированные слова в качестве идентификаторов, например имена моделей или таблиц. В любом случае мы рекомендуем избегать использования таких зарезервированных слов.
  • Если вы используете Fusion и в вашем окружении Snowflake установлен параметр сессии QUOTED_IDENTIFIERS_IGNORE_CASE = true (например, в оркестраторе или pre-hook), вам также следует включить quoting и snowflake_ignore_case в вашем dbt_project.yml, чтобы сохранить точный регистр имён базы данных, схемы и идентификаторов:

    quoting:
    database: true
    schema: true
    identifier: true
    snowflake_ignore_case: true # Конфигурация только для Fusion. Соответствует поведению параметра сессии Snowflake QUOTED_IDENTIFIERS_IGNORE_CASE.
    # Игнорируется dbt Core и другими адаптерами.

    Установка snowflake_ignore_case: true гарантирует, что имена колонок и идентификаторов, которые dbt генерирует на этапе компиляции, будут соответствовать поведению Snowflake во время выполнения запросов. Это сохраняет согласованность между логикой на этапе компиляции и во время выполнения. Без этого вы можете столкнуться с ошибками вида «column not found».

Цитирование источника

Если исходная таблица Snowflake использует экранированные (quoted) идентификаторы базы данных, схемы или таблицы, вы можете настроить это в файле source.yml. Подробнее см. в разделе configuring quoting.

Пояснение

dbt по умолчанию пропускает quoting в Snowflake, чтобы имена моделей в нижнем регистре корректно использовались в downstream-запросах и BI-инструментах без необходимости думать о регистре или кавычках.

В отличие от большинства баз данных (которые приводят неэкранированные идентификаторы к нижнему регистру), Snowflake приводит их к верхнему регистру. Когда вы используете quoted-идентификаторы, Snowflake сохраняет их регистр и делает их чувствительными к регистру. Это означает, что если вы создаёте таблицу с экранированными идентификаторами в нижнем регистре, к такой таблице всегда нужно обращаться с кавычками и строго в том же регистре. Это легко может сломать downstream-запросы в BI-инструментах или ad-hoc SQL.

Поскольку в dbt по соглашению используются имена моделей и файлов в нижнем регистре, их экранирование в Snowflake повышает риск поломки downstream-запросов в BI-инструментах или ad-hoc SQL. Если бы dbt, наоборот, использовал имена в верхнем регистре по умолчанию, это могло бы привести к проблемам с безопасными значениями по умолчанию в других базах данных.

snowflake_casing.sql
/*
Выполните эти запросы, чтобы понять, как Snowflake обрабатывает регистр символов и кавычки.
*/

-- Это вывод примерной модели `orders.sql` с включенными кавычками
create table "analytics"."orders" as (

select 1 as id

);

/*
Эти запросы НЕ будут работать! Поскольку таблица выше была создана с кавычками,
Snowflake создал таблицу orders с нижним регистром схемы и идентификатора.

Поскольку некавыченные идентификаторы автоматически приводятся к верхнему регистру,
оба следующих запроса эквивалентны, и ни один из них не будет работать правильно.
*/

select * from analytics.orders;
select * from ANALYTICS.ORDERS;

/*
Чтобы выполнить запрос к этой таблице, вам нужно будет заключить в кавычки схему и таблицу. Этот
запрос действительно должен завершиться без ошибки.
*/

select * from "analytics"."orders";


/*
Чтобы избежать этого безумия с кавычками, вы можете отключить экранирование (quoting) для схем и идентификаторов в файле `dbt_project.yml`. Это означает, что вы не сможете использовать зарезервированные слова в качестве имён моделей, но этого всё равно следует избегать. Если экранирование схем и идентификаторов отключено, следующий запрос действительно будет работать:
*/

select * from analytics.orders;

Другие хранилища

Оставьте значения по умолчанию для вашего хранилища.

Нашли ошибку?

0
Loading