static_analysis
Конфигурация static_analysis доступна только в dbt v2. Она недоступна в dbt v1 и будет игнорироваться. Чтобы перейти на dbt v2, обратитесь к разделу Начало работы с dbt v2.
Настройка static_analysis определяет, как dbt v2 проверяет SQL до выполнения. Режим strict выполняет строгий анализ, baseline сочетает проверки с совместимостью, а off отключает анализ. Допустимые места настройки зависят от типа ресурса.
Какие функции доступны в режиме strict в dbt v2, описано в разделах Поддержка функций Snowflake и Поддержка функций BigQuery.
- Модели
- Тесты
- Исходные данные (seeds)
- Снимки
- Модульные тесты
models:
resource-path:
+static_analysis: strict | baseline | off
models:
- name: model_name
config:
static_analysis: strict | baseline | off
{{ config(static_analysis='strict' | 'baseline' | 'off') }}
data_tests:
+static_analysis: strict | baseline | off
models:
- name: model_name
data_tests:
- not_null:
arguments:
column_name: your_column_name
config:
static_analysis: strict | baseline | off
seeds:
resource-path:
+static_analysis: strict | baseline | off
seeds:
- name: seed_name
config:
static_analysis: strict | baseline | off
snapshots:
resource-path:
+static_analysis: strict | baseline | off
snapshots:
- name: snapshot_name
config:
static_analysis: strict | baseline | off
unit_tests:
resource-path:
+static_analysis: strict | baseline | off
unit_tests:
- name: unit_test_name
model: model_name
config:
static_analysis: strict | baseline | off
Определение
Вы можете настроить static_analysis для моделей, тестов данных, модульных тестов, seed-файлов и снимков.
Вы можете настроить, будет ли dbt v2 выполнять статический анализ SQL для модели и когда именно. Задайте конфигурацию static_analysis в YAML-файле проекта (dbt_project.yml), YAML-файле свойств модели или в блоке конфигурации SQL в файле модели. Подробнее о различных режимах статического анализа см. в разделе Принципы статического анализа.
Установка режима strict для модели не устанавливает strict автоматически для нижестоящих моделей; они сохраняют настройку проекта по умолчанию, если вы не настроите их явно. Дополнительные сведения и примеры см. в разделе Наследование строгого режима.
Для static_analysis доступны следующие значения:
baseline(по умолчанию): статический анализ SQL. Это рекомендуемый начальный режим для пользователей, переходящих с dbt v1: он обеспечивает плавную миграцию и при этом выявляет большинство ошибок SQL. Со временем вы можете постепенно переходить к более строгому анализу.strict: статический анализ всего SQL до начала выполнения. Используйте этот режим для максимально полной проверки — выполнение не начнётся, пока не будет подтверждена корректность всего проекта.off: отключение анализа SQL для этой модели и всех её потомков.
Пользовательские функции (UDF) в режиме strict
При настройке static_analysis: strict dbt v2 разбирает операторы CREATE FUNCTION из sql_header и хуков проекта on-run-start, регистрирует эти UDF в реестре компилятора и делает их доступными при строгой статической компиляции. В режимах baseline и off такая регистрация UDF для статического анализа не выполняется.
Параметр sql_header модели может содержать несколько операторов. dbt v2 регистрирует UDF из операторов CREATE FUNCTION и на этом этапе игнорирует остальные операторы.
Если строгий анализ по-прежнему не может разрешить ссылку на UDF, задайте static_analysis: off для затронутых моделей.
Как каскадно распространяются режимы статического анализа
Применение режимов static_analysis в графе зависимостей определяется двумя правилами:
- Правило допустимости: статический анализ модели возможен только в том случае, если он возможен для всех её «родителей» (под родителями понимаются модели, расположенные выше текущей модели в графе зависимостей).
- Правило строгости: режим «дочерней» модели не может быть строже режима родительской (под дочерними понимаются модели, расположенные ниже текущей модели в графе зависимостей).
Настройка статического анализа каскадно распространяется от наиболее строгого режима к наименее строгому. Иерархия строгости выглядит так:
strict → baseline → off
Допустимые режимы для зависимых моделей в зависимости от режима родительской модели
При движении вниз по графу зависимостей можно сохранить тот же режим или ослабить его, но нельзя сделать режим дочерней модели строже родительского. В следующей таблице показаны допустимые режимы для зависимых моделей в зависимости от режима родительской модели:
| Режим родительской модели | Допустимый режим дочерней модели |
|---|---|
strict | strict, baseline или off |
baseline | baseline или off (но не strict) |
off | только off |
Например, для цепочки зависимостей «Модель A → Модель B → Модель C»:
- Если для модели A задан режим
baseline, вы не можете задать для модели B режимstrict - Если для модели A задан режим
strict, вы можете задать для модели B режимbaseline
Это гарантирует, что более строгие требования к проверке не будут применяться к зависимым моделям, если родительские модели не соответствуют этим требованиям. Режим baseline не формирует полную проанализированную схему, которая нужна режиму strict от вышестоящих моделей, поэтому модель, зависящая от модели с режимом baseline, не может выполнять проверку типов на уровне strict.
Более подробное обсуждение и иллюстрации см. на странице концепций v2: Новые концепции. Дополнительные сведения о схеме JSON см. в файле dbt-jsonschema.
Пользовательские материализации
К моделям, использующим пользовательскую материализацию, применяются те же правила static_analysis, что и к любой другой модели, независимо от того, даёте ли вы материализации новое имя или используете имя встроенной материализации, например table или incremental. Зависимые модели подчиняются обычным правилам каскадного распространения.
Если пользовательская материализация добавляет или переименовывает столбцы либо меняет их типы, dbt v2 не может предсказать эти изменения на основе SQL модели. В первую очередь это влияет на режим strict, которому нужны точные схемы вышестоящих моделей. Если вы используете strict, задайте static_analysis: off для моделей, использующих такую материализацию.
Поскольку режим off распространяется каскадно, все зависимые модели также теряют возможность статического анализа и использования связанных с ним функций, таких как отслеживание зависимостей на уровне столбцов и проверка типов. Чтобы сохранить охват статическим анализом в вашем DAG, используйте материализации, изменяющие схему, для моделей, от которых не зависят другие модели.
Дополнительные сведения см. в разделе Пользовательские материализации.
Переопределение в CLI
Вы можете переопределить конфигурацию уровня модели для отдельного запуска с помощью флага --static-analysis. Например, чтобы отключить статический анализ для запуска:
dbt run --static-analysis off # disable static analysis for all models
dbt run --static-analysis baseline # use baseline analysis for all models
Примеры
Следующие примеры показывают, как отключить или настроить static_analysis для различных сценариев:
- Включение строгого анализа для всех моделей
- Отключение статического анализа для всех моделей в пакете
- Отключение статического анализа в YAML для отдельной модели
- Отключение статического анализа в SQL для модели, использующей пользовательскую UDF
- Настройка статического анализа для тестов данных
- Настройка статического анализа для модульных тестов
- Настройка статического анализа для seed-файлов
- Настройка статического анализа для снимков
Включение строгого анализа для всех моделей
Рекомендуемый способ обеспечить максимально полную проверку SQL во всём проекте — задать значение strict в конфигурации models верхнего уровня в файле dbt_project.yml. Эта конфигурация включает строгий анализ для каждой модели в проекте, поэтому настраивать каждую модель отдельно не требуется:
name: jaffle_shop
models:
jaffle_shop:
+static_analysis: strict
staging:
+materialized: view
marts:
+materialized: table
При необходимости для отдельных подкаталогов или моделей можно задать значение baseline или off (например, для моделей, использующих неподдерживаемые UDF). Для отдельных моделей можно использовать менее строгие настройки, чем в конфигурации уровня проекта, но нельзя задать более строгие. Значение по умолчанию для проекта — baseline.
В этом примере строгий статический анализ применяется только к моделям Jaffle Shop. Установленные пакеты сохраняют настройку по умолчанию baseline, если вы явно не настроите их иначе.
Отключение статического анализа для всех моделей в пакете
В этом примере показано, как отключить статический анализ для всех моделей в пакете. Префикс + применяет конфигурацию ко всем моделям в пакете.
name: jaffle_shop
models:
jaffle_shop:
marts:
+materialized: table
a_package_with_introspective_queries:
+static_analysis: off
Отключение статического анализа в YAML для отдельной модели
В этом примере показано, как отключить статический анализ для одной модели в YAML.
models:
- name: model_with_static_analysis_off
config:
static_analysis: off
Отключение статического анализа SQL для модели, использующей пользовательскую UDF
В этом примере показано, как отключить статический анализ для модели, использующей пользовательскую user-defined function (UDF), в SQL-файле.
{{ config(static_analysis='off') }}
select
user_id,
my_cool_udf(ip_address) as cleaned_ip
from {{ ref('my_model') }}
Настройка статического анализа для тестов данных
В этом примере показано, как настроить статический анализ для всех тестов в проекте с помощью dbt_project.yml.
# dbt_project.yml
data_tests:
+static_analysis: baseline
Чтобы настроить статический анализ для конкретного теста данных модели:
# models/filename.yml
models:
- name: my_model
data_tests:
- not_null:
arguments:
column_name: order_id
config:
static_analysis: off
Настройка статического анализа для модульных тестов
Вы можете задать static_analysis для модульных тестов, которые проверяют логику вашего SQL на статических тестовых данных перед построением модели.
В этом примере показано, как настроить статический анализ для всех модульных тестов в проекте с помощью dbt_project.yml.
# dbt_project.yml
unit_tests:
my_project:
+static_analysis: baseline
Чтобы настроить отдельный модульный тест в файле свойств:
# models/filename.yml
unit_tests:
- name: test_is_valid_email_address
model: dim_customers
config:
static_analysis: off
Если для модульного теста задать compute: local (при этом тест выполняется с помощью DuckDB, а не вашей платформы данных), его режим static_analysis повышается до strict, поскольку для локального выполнения требуется строгий анализ, позволяющий преобразовать ваш SQL в диалект DuckDB. Это происходит, даже если вы сами задали для теста baseline.
Если задать static_analysis: off для модульного теста, настроенного на локальное выполнение, тест не сможет выполниться и завершится с ошибкой ExecutorFailed (dbt1401). Вместо этого используйте для такого теста compute: remote.
compute: local — экспериментальная возможность, для которой требуется установить переменную окружения DBT_ENGINE_EXPERIMENTAL_LOCAL_UNIT_TESTS в значение true, поэтому описанное взаимодействие действует только после её явного включения.
Настройка статического анализа для seed-файлов
В этом примере показано, как настроить статический анализ для всех seed-файлов в проекте.
# dbt_project.yml
seeds:
your_project:
+static_analysis: baseline
Чтобы настроить отдельный seed-файл в файле свойств:
# seeds/filename.yml
seeds:
- name: my_seed
config:
static_analysis: off
Настройка статического анализа для снимков
В этом примере показано, как настроить статический анализ для всех снимков в проекте.
# dbt_project.yml
snapshots:
your_project:
+static_analysis: baseline
Чтобы настроить отдельный снимок в файле свойств:
# snapshots/filename.yml
snapshots:
- name: my_snapshot
config:
static_analysis: off
Особенности использования
- Для моделей отключение статического анализа означает, что функции расширения VS Code, зависящие от понимания SQL, будут недоступны.
- Для моделей статический анализ в некоторых случаях может завершаться ошибкой (например, при использовании динамических SQL-конструкций или нераспознанных UDF), и вам может потребоваться задать
static_analysis: off. Дополнительные примеры приведены в разделе Когда следует отключать статический анализ?. - Поскольку режимы применяются каскадно, заданный вами режим не всегда совпадает с фактически действующим. Чтобы проверить действующий режим для модели, используйте CodeLens в расширении dbt для VS Code или в Studio IDE: он показывает, для каких моделей статический анализ отключён и почему.
Связанная документация
- О статическом анализе
- Флаг
--static-analysis - Оптимизация статического анализа для разработки и развёртывания