Настройка кавычек в проектах
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 здесь следует использовать database и schema, хотя эти настройки будут применяться к именам project и dataset соответственно.
Значение по умолчанию
Значения по умолчанию зависят от базы данных.
- По умолчанию
- Snowflake
Для большинства адаптеров кавычки по умолчанию установлены в true.
Почему? Работать с SELECT одинаково просто как с отношениями, использующими идентификаторы в кавычках, так и без них. Кавычки позволяют использовать зарезервированные слова и специальные символы в именах идентификаторов, однако мы рекомендуем по возможности избегать использования зарезервированных слов и специальных символов в идентификаторах.
quoting:
database: true
schema: true
identifier: true
Для Snowflake экранирование (quoting) по умолчанию установлено в значение false.
Создание связей с идентификаторами в кавычках делает эти идентификаторы чувствительными к регистру. Выбор из них становится гораздо сложнее. Вы можете повторно включить кавычки для идентификаторов связей, которые чувствительны к регистру, являются зарезервированными словами или содержат специальные символы, но мы рекомендуем избегать этого, насколько это возможно.
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.
Примеры
Установите quoting в значение false для проекта:
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также означает, что вы не сможете использовать зарезервированные слова в качестве идентификаторов, например имена моделей или таблиц. В любом случае мы рекомендуем избегать использования таких зарезервированных слов.
- Установка всех параметров quoting в
-
Если вы используете 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 обрабатывает регистр символов и кавычки.
*/
-- Это вывод примерной модели `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;
Другие хранилища
Оставьте значения по умолчанию для вашего хранилища.