Upgrading to v1.12
dbt Core v1.12 is not yet available in beta. We will update this guide when it becomes available.
Resources
- dbt Core v1.12 changelog (coming soon)
- dbt Core CLI Installation guide
- Cloud upgrade guide
What to know before upgrading
dbt Labs is committed to providing backward compatibility for all versions 1.x. Any behavior changes will be accompanied by a behavior change flag to provide a migration window for existing projects. If you encounter an error upon upgrading, please let us know by opening an issue.
dbt provides the functionality from new versions of dbt Core via release tracks with automatic upgrades. If you have selected the Latest release track in dbt, you already have access to all the features, fixes, and other functionality included in the latest dbt Core version! If you have selected the Compatible release track, you will have access to the next monthly Compatible release after the dbt Core v1.12 final release.
New and changed features and functionality
on_error model config Beta
You can configure whether downstream models run when an upstream model fails using the on_error config. Set on_error: continue on a model to allow its downstream models to still attempt to run even when it fails. By default (skip_children), dbt skips all downstream models on failure. Note that --fail-fast takes precedence — runs with --fail-fast stop at the first failure, even if a model is configured with on_error: continue.
New Semantic Layer YAML spec
dbt Core v1.12 adds support for the latest Semantic Layer YAML specification, which simplifies how you define metrics and dimensions by embedding semantic annotations directly alongside each model.
Key changes in the new spec:
semantic_modelis nested directly under each model instead of being a standalone top-level key.- Entities and dimensions are defined at the column level.
- Measures are replaced with
type: simplemetrics defined within the model. type_paramsis deprecated; its parameters are now top-level keys within each metric definition.
For migration guidance and a comparison between the latest spec and the legacy spec, refer to Migrate to the latest YAML spec. For the semantic model reference, refer to Semantic models.
.env file for environment variables Beta
dbt Core now automatically loads environment variables from a .env file in your current working directory. Shell environment variables take precedence over .env values. New projects created with dbt init include .env in the default .gitignore. For more information, refer to About env_var function.
packages config for Python UDFs Beta
You can specify public third-party PyPI packages for your Python UDF with the optional packages config. The warehouse installs these packages when it creates the UDF, which lets your UDF use functionality from external Python libraries. For more information, refer to Defining UDFs in dbt and the packages config reference.
selector method for named YAML selectors Beta
You can reference a named selector from selectors.yml inside --select or --exclude using the selector method (for example, selector:my_selector). This makes it easier to compose reusable YAML selectors with other selection methods, graph operators, and set operators on the command line without duplicating logic.
When you use the legacy --selector flag together with --select or --exclude, dbt only uses --selector for node selection and ignores --select and --exclude. Starting in dbt Core v1.12, dbt also raises a warning when these flags are combined. If you want to combine a selector with --select or --exclude, use the new selector: method instead.
Compiled SQL for snapshots Beta
dbt compile writes compiled SQL for snapshots to target/compiled/, consistent with models, tests, analyses, and functions. Each snapshot gets its own output file, named from the snapshot identifier, so multiple snapshot blocks in the same source file do not share one compiled path.
For more information, refer to About dbt compile.
Support for vars.yml Beta
You can use the vars.yml file, located at the project root, to define project variables. This keeps variable definitions in one place and helps simplify dbt_project.yml. Variables defined in vars.yml are parsed before dbt_project.yml, so you can reference them in dbt_project.yml using {{ var('...') }}. You can continue to define variables in dbt_project.yml as before, but you cannot define variables in both files. For details and precedence, refer to Project variables.
Improved exception handling and error messages
dbt Core v1.12 improves exception handling so error messages are clearer and stack traces are easier to interpret.
Previously, some internal failures surfaced as Python errors (for example, AttributeError, KeyError, IndexError, RuntimeError), which could be difficult to understand. In dbt Core v1.12, these are replaced with dbt errors (such as CompilationError and ParsingError) that include a clear error message. When you need the full Python error output for debugging, use --debug or check the logs.
Key improvements:
- Cleaner default output: Built-in Python exceptions (
Exception,ValueError,RuntimeError) are replaced with dbt errors, so dbt no longer treats them as internal errors or displays unnecessary stack traces. - Parsing and config validation: Invalid field values raise a
ParsingErrorinstead of a rawInvalidFieldValueexception when applyingdbt_project.ymlconfigs to resources. In a generic data test, aconfigvalue that is a string or a number instead of a set of key-value pairs raises aTestConfigNotDictError. - Snapshot validation: When snapshot validation fails, dbt shows the relevant error message and omits the long Python error output.
dbt run-operation: When arun-operationcall fails, the exception message is included inrun_results.json, which makes failures easier to inspect.- Cycle detection: Dependency graph cycles raise a
CompilationErrorinstead of the built-inRuntimeError. - Semantic model dependencies: When a semantic model references a disabled or missing model, dbt raises a
CompilationErrorinstead of anIndexError.
Managing changes to legacy behaviors
dbt Core v1.12 introduces new flags for managing changes to legacy behaviors. You may opt into recently introduced changes (disabled by default), or opt out of mature changes (enabled by default), by setting true / false values, respectively, for flags in dbt_project.yml.
You can read more about each of these behavior changes in the following links:
- (Introduced, disabled by default)
require_valid_schema_from_generate_schema_name. This flag is set tofalseby default. With this setting, dbt raises theGenerateSchemaNameNullValueDeprecationwarning when a customgenerate_schema_namemacro returns anullvalue. When set totrue, dbt enforces stricter validation and raises a parsing error instead of a warning. - (Introduced, disabled by default)
require_sql_header_in_test_configs. When set totrue, you can setsql_headerin theconfigof a generic data test at the model or column level in yourproperties.ymlfile. For more information, refer to Data test configurations. - (Introduced, disabled by default)
require_corrected_analysis_fqns. When set totrue, dbt applies project-level analysis configuration fromdbt_project.yml. Previously, dbt silently ignored this configuration. This flag also corrects fully qualified names (FQNs) of analyses by removing the extra path segment, making them consistent with other resource types (for example,your_project.my_analysisinstead ofyour_project.analyses.my_analysis). For more information, refer to Analyses. - (Introduced, disabled by default)
require_source_and_semantic_model_names_without_spaces. By default, dbt raises aResourceNamesWithSpacesDeprecationwarning if it detects a space in a source name or semantic model name. When the flag is set totrue, dbt raises an error.
Adapter-specific features and functionalities
Snowflake
-
You can set the
iceberg_versionconfig on Snowflake Iceberg tables to control which Iceberg format version Snowflake uses. Set it to3to use Iceberg V3, which improvesVARIANTtype support and makes row-level changes more efficient by tracking deletions separately instead of rewriting data. The default value is2. Note that you cannot change the value oficeberg_versionafter table creation. -
You can configure the
schedulerparameter on Snowflake dynamic tables to control how refreshes are managed. Setting it toENABLElets Snowflake automatically refresh the dynamic table, whileDISABLEmeans dbt manages refreshes during model execution. Whenscheduleris set toENABLE, you must also specifytarget_lag.By default, dbt sets
schedulertoDISABLE(unlike Snowflake’s native default ofENABLE), so dbt controls the refresh schedule unless you explicitly opt in to Snowflake’s scheduler. If you specifytarget_lagwithout settingscheduler, dbt automatically setsschedulertoENABLE. -
You can use the
snowflake_initialization_warehouseparameter to specify a warehouse for the initial build and reinitialization of a dynamic table, separate fromsnowflake_warehousewhich is used for regular incremental refreshes. -
You can create Snowflake dynamic tables as transient (no Fail-safe period) by setting the
transientconfig on models.When
transientis not set on a model, thesnowflake_default_transient_dynamic_tablesflag controls the default. Set this flag totrueto make all dynamic tables transient by default.
BigQuery
- Added the
bigquery_use_standard_sql_for_partitionsflag. When set totrue, dbt uses standard SQL (INFORMATION_SCHEMA.PARTITIONS) instead of legacy SQL ($__PARTITIONS_SUMMARY__) when callingget_partitions_metadata(). The flag defaults tofalsein this release. BigQuery is deprecating legacy SQL starting June 1, 2026, so it is recommended to migrate before that date. - Added the
bigquery_reject_wildcard_metadata_source_freshnessflag. When you set this flag totrue, dbt raises aDbtRuntimeErrorif you run metadata-based source freshness checks with wildcard table identifiers (for example,events_*), preventing incorrect freshness results. - You can configure BigQuery job link logging with
job_link_info_level_log. By default, dbt logs job links at the debug level. To log job links at the info level, setjob_link_info_level_log: truein your BigQuery profile. This makes job links visible in dbt logs for easier access to the BigQuery console. For more information, see BigQuery setup. - You can set
job_execution_timeout_secondsper model, snapshot, seed, or test, in addition to the profile-level configuration. The per-resource value takes precedence over the default value set in the profile level. For more information, refer to BigQuery setup.
Redshift
- The
redshift_skip_autocommit_transaction_statementsflag defaults tofalse, preserving legacy behavior of sendingBEGIN/COMMIT/ROLLBACKstatements even when autocommit is enabled. To skip unnecessary transaction statements and improve performance, set the flag totrue. - Added support for the
query_groupsession parameter, allowing dbt to tag queries for Redshift Workload Manager routing and query logging. When configured in a profile, dbt setsquery_groupwhen opening a connection and the value applies for the duration of that session. You can also configurequery_groupat the model level to temporarily override the default value for a specific model, and dbt reverts the value at the end of model materialization. For more information, see Redshift configurations.
Quick hits
dbt seednow supports the--emptyflag. Use it to create seed tables with the correct schema but without loading any data.
Was this page helpful?
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.