Skip to main content

Upgrading to v2.0

dbt Core v2.0 is in alpha

dbt Core v2.0 is currently in alpha. This does not affect the Fusion in platform rollout, which continues on its existing track.

v2.0 marks a new foundation for dbt: a faster, Rust-based runtime, rebuilt from the ground up and available in two distributions. For most users, the right choice is Fusion, which extends the open-source core with SQL comprehension, column-level lineage, instant feedback, and platform-connected workflows.

For license-aware customers, we offer dbt Core v2.0, a distribution that includes only Apache 2.0 open-source code. Both distributions share the same project language and DAG semantics, so once you upgrade to v2.0, your existing dbt project works with either distribution.

important

The dbt Fusion engine is currently available for installation in:

Join the conversation in our Community Slack channel #dbt-fusion-engine.

Read the Fusion Diaries for the latest updates.

More information about Fusion

Fusion marks a significant update to dbt. While many of the workflows you've grown accustomed to remain unchanged, there are a lot of new ideas, and a lot of old ones going away. The following is a list of the full scope of our current release of the Fusion engine, including implementation, installation, deprecations, and limitations:

Distributions

Two dbt distributions build on the Fusion runtime:

DistributionInstallLicenseWhat you get
Fusionpip, brew, winget, CDN — see all optionsProprietarydbt Core v2.0 foundation plus Fusion features: SQL comprehension, column-level lineage, and more.
dbt Core v2.0pip, brewApache 2.0Open-source Rust-based runtime: Faster parsing and execution.
Loading table...

Installation

For most users, the recommended path is to install Fusion as it includes all of dbt Core v2.0 plus the robust Fusion feature set.

Fusion

Install Fusion using pip, or see all installation options (brew, winget, CDN):

python -m pip install --pre dbt

dbt Core v2.0

If you specifically need the open-source distribution of v2, install dbt Core. During alpha, you must target either the pre-release version or an explicit pin. You can copy the following commands to install the alpha and immediately update to the most recent version:

Pre-release version:

python -m pip install --pre dbt-core

Explicit pin:

python -m pip install dbt-core==2.0.0-alpha.1

What to know before upgrading

This new major version is an opportunity to strengthen the framework by removing deprecated functionality, rationalizing confusing behavior, and providing more rigorous validation on erroneous inputs. This means that there is some work involved in preparing an existing dbt project for v2.

That work is documented below — it should be simple, straightforward, and in many cases, auto-fixable with the dbt-autofix helper or the agent skill.

Test Fusion parser compatibility from dbt Core v1.12

If you're on dbt Core v1.12, you can test Fusion parser compatibility before fully migrating by using the opt-in --use-v2-parser flag. This delegates parsing to the Fusion parser without changing any other behavior, making it a low-risk way to catch compatibility issues early.

Upgrade considerations

Keep in mind the following considerations during the upgrade process:

  • Manifest incompatibilityFusion is backwards-compatible and can read dbt Core manifests. However, dbt Core isn't forward-compatible and can't read Fusion manifests. Fusion produces a v20 manifest, while the latest version of dbt Core still produces a v12 manifest.

    As a result, mixing dbt Core and Fusion manifests across environments breaks cross-environment features. To avoid this, use state:modified, --defer, and cross-environment dbt docs generate only after all environments are running the latest Fusion version. Using these features before all environments are on Fusion may cause errors and failures.

  • State-aware orchestration — If using state-aware orchestration, dbt doesn't detect a change if a table or view is dropped outside of dbt, as the cache is unique to each dbt platform environment. This means state-aware orchestration will not rebuild that model until either there is new data or a change in the code that the model uses.

    • Workarounds:
      • Use the Clear cache button on the target Environment page to force a full rebuild (acts like a reset), or
      • Temporarily disable state-aware orchestration for the job and rerun it.
    State-aware orchestration is now dbt State

    dbt State works with all engines and environments: dbt Core, the dbt platform, and dbt Fusion engine.

    If you're using state-aware orchestration prior to June 1, 2026, you can continue using it. Existing state-aware orchestration customers automatically receive a 90-day trial of dbt State. To get started, refer to Migrate from state-aware orchestration.

Supported adapters

The following adapters are supported in v2.0:

 BigQueryPreview
 DatabricksPrivate preview
  • Service Account / User Token
  • Native OAuth
 RedshiftPreview
  • Username / Password
  • IAM profile
 Snowflake
  • Username / Password
  • Native OAuth
  • External OAuth
  • Key pair using a modern PKCS#8 method
  • MFA
 Apache Spark (Fusion CLI only)Beta
  • Thrift
    • Simple Authentication and Security Layer (SASL) PLAIN
    • No SASL (NOSASL)
  • Livy
    • Basic authentication (username and password)
    • When deployed on Amazon Web Services (AWS): AWS Signature Version 4
      • Supports authentication using single sign-on, service accounts, or user tokens
 DuckDB (Fusion CLI only)Beta

DuckDB does not require authentication — it runs locally on your machine.

A clean slate

v2 will not support any deprecated functionality (see the Changes overview for details):

Ecosystem packages

The most popular dbt-labs packages (dbt_utils, audit_helper, dbt_external_tables, dbt_project_evaluator) are already compatible with Fusion. External packages published by organizations outside of dbt may use outdated code or incompatible features that fail to parse with the new Fusion engine. We're working with those package maintainers to make packages available for Fusion. Packages requiring an upgrade to a new release for Fusion compatibility, will be documented in this upgrade guide.

New and changed features and functionality

Changed functionality

When developing v2, there were opportunities to improve the dbt framework — failing earlier (when possible), fixing bugs, optimizing run order, and deprecating flags that are no longer relevant. The result is a handful of specific and nuanced changes to existing behavior.

When upgrading to v2, you should expect the following changes in functionality:

Parse time printing of relations will print out the full qualified name, instead of an empty string

In dbt Core v1, when printing the result of get_relation(), the parse time output for that Jinja would print None (the undefined object coerces to the string "None").

In v2, to help with intelligent batching of get_relation() calls (and significantly speed up dbt compile), dbt needs to construct a relation object with the fully qualified name resolved at parse time for the get_relation() adapter call.

Constructing a relation object with the fully qualified name in v2 produces different behavior than v1 in print(), log(), or any Jinja macro that outputs to stdout or stderr at parse time.

Example:

{% set relation = adapter.get_relation(
database=db_name,
schema=db_schema,
identifier='a')
%}
{{ print('relation: ' ~ relation) }}

{% set relation_via_api = api.Relation.create(
database=db_name,
schema=db_schema,
identifier='a'
) %}
{{ print('relation_via_api: ' ~ relation_via_api) }}

The output after dbt parse in dbt Core v1:

relation: None
relation_via_api: my_db.my_schema.my_table

The output after dbt parse in v2:

relation: my_db.my_schema.my_table
relation_via_api: my_db.my_schema.my_table

Deprecated flags

Deprecated flags are command-line flags (like --models, --print) that you pass to dbt commands. These are being removed in v2. This is different from:

See the Changes overview for a full comparison.

Some historic CLI flags from v1 will no longer do anything in v2. If you pass them into a dbt command in v2, the command will not error, but the flag will do nothing (and warn accordingly).

flag nameremediation
--models / --model / -mRefer to CLI flags that need changes.
dbt seed --showN/A
--print / --no-printNo action required
--printer-widthNo action required
--sourceNo action required
--record-timing-info / -rNo action required
--cache-selected-only / --no-cache-selected-onlyNo action required
--clean-project-files-only / --no-clean-project-files-onlyNo action required
--single-threaded / --no-single-threadedNo action required
dbt source freshness --output / -o
--config-dirNo action required
--resource-type / --exclude-resource-typeRefer to CLI flags that need changes.
--show-resource-report / --no-show-resource-reportNo action required
--log-cache-events / --no-log-cache-eventsNo action required
--use-experimental-parser / --no-use-experimental-parserNo action required
--empty-catalog
--compile / --no-compile
--inline-directNo action required
--partial-parse-file-diff / --no-partial-parse-file-diffNo action required
--partial-parse-file-pathNo action required
--populate-cache / --no-populate-cacheNo action required
--static-parser / --no-static-parserNo action required
--use-fast-test-edges / --no-use-fast-test-edgesNo action required
--introspect / --no-introspectNo action required
--inject-ephemeral-ctes / --no-inject-ephemeral-ctes
--partial-parse / --no-partial-parseRefer to CLI flags that need changes.
Loading table...
CLI flags that need changes

The following deprecated flags require updates in your job definitions or scripts:

  • --models / --model / -m: Use --select / -s instead (renamed in dbt Core v0.21). dbt raises an error in v2 if you use the old flags. Do not pass --models as the value to -s (for example, dbt run -s --models); v1 treated that as a model name, but v2 requires a valid selector.

  • --resource-type / --exclude-resource-type: Use --resource-types / --exclude-resource-types. For more information, see Resource type flags.

Fusion job runs no longer support the --partial-parse and --no-partial-parse CLI flags. If you pass them (for example, from a dbt Core command or script), dbt logs deprecation warning dbt1700. Remove these flags from your Fusion job commands. For more information, refer to Deprecated flags in the guide to upgrading to the dbt Fusion engine.

Conflicting package versions when a local package depends on a hub package which the root package also wants will error

If a local package depends on a hub package that the root package also wants, dbt deps doesn't resolve conflicting versions in dbt Core v1; it will install whatever the root project requests.

Fusion will present an error:

error: dbt8999: Cannot combine non-exact versions: =0.8.3 and =1.1.1

Parse will fail on nonexistent macro invocations and adapter methods

When you call a nonexistent macro in dbt:

select
id as payment_id,
# my_nonexistent_macro is a macro that DOES NOT EXIST
{{ my_nonexistent_macro('amount') }} as amount_usd,
from app_data.payments

Or a nonexistent adapter method:

{{ adapter.does_not_exist() }}

In v1, dbt parse passes, but dbt compile fails.

In v2, dbt will error out during parse.

Parse will fail on missing generic test

When you have an undefined generic test in your project:


models:
- name: dim_wizards
data_tests:
- does_not_exist

In v1, dbt parse passes, but dbt compile fails.

In v2, dbt will error out during parse.

Parse will fail on missing variable

When you have an undefined variable in your project:


select {{ var('does_not_exist') }} as my_column

In v1, dbt parse passes, but dbt compile fails.

In v2, dbt will error out during parse.

Stricter evaluation of duplicate docs blocks

In v1, it was possible to create scenarios with duplicate docs blocks. For example, you can have two packages with identical docs blocks referenced by an unqualified name in your dbt project. In this case, v1 would use whichever docs block is referenced without any warnings or errors.

Fusion adds stricter evaluation of names of docs blocks to prevent such ambiguity. It will present an error if it detects duplicate names:

dbt found two docs with the same name: 'docs_block_title' in files: 'models/crm/_crm.md' and 'docs/crm/business_class_marketing.md'

To resolve this error, rename any duplicate docs blocks.

dbt clean will not delete any files in configured resource paths or files outside the project directory

In dbt Core v1, dbt clean deletes:

  • Any files outside the project directory if clean-targets is configured with an absolute path or relative path containing ../, though there is an opt-in config to disable this (--clean-project-files-only / --no-clean-project-files-only).
  • Any files in the asset-paths or doc-paths (even though other resource paths, like model-paths and seed-paths, are restricted).

In v2, dbt clean will not delete any files in configured resource paths or files outside the project directory.

All unit tests are run first in dbt build

In dbt Core v1, the direct parents of the model being unit tested needed to exist in the warehouse to retrieve the needed column name and type information. dbt build runs the unit tests (and their dependent models) in lineage order.

In v2, dbt build runs all of the unit tests first, and then builds the rest of the DAG, due to built-in column name and type awareness.

Configuring --threads

dbt Core v1 runs with --threads 1 by default. You can increase this number to run more nodes in parallel on the remote data platform, up to the max parallelism enabled by the DAG.

v2 handles threading differently depending on your data platform:

AdapterBehavior
SnowflakeFusion ignores user-set threads and automatically optimizes parallelism for maximum performance.
The only supported override is threads: 1, which can also help resolve timeout issues if set.
DatabricksFusion ignores user-set threads and automatically optimizes parallelism for maximum performance.
The only supported override is threads: 1, which can also help resolve timeout issues if set.
BigQueryFusion respects user-set threads to manage API rate limits.
Setting --threads 0 (or omitting the setting) allows Fusion to dynamically optimize parallelism.
RedshiftFusion respects user-set threads to manage concurrency limits.
Setting --threads 0 (or omitting the setting) allows Fusion to dynamically optimize parallelism.
Loading table...

For more information, refer to Using threads.

Continue to compile unrelated nodes after hitting a compile error

As soon as dbt Core v1 compile encounters an error compiling one of your models, dbt stops and doesn't compile anything else.

When Fusion's compile encounters an error, it will skip nodes downstream of the one that failed to compile, but it will keep compiling the rest of the DAG (in parallel, up to the number of configured / optimal threads).

Seeds with extra commas don't result in extra columns

In dbt Core v1, if you have an additional comma on your seed, dbt creates a seed with an additional empty column.

For example, the following seed file (with an extra comma):

animal,  
dog,
cat,
bear,

Will produce this table when dbt seed is executed:

animalb
dog
cat
bear
Loading table...

In v2, it will not produce this extra column in the table resulting from dbt seed:

animal
dog
cat
bear
Loading table...

Move standalone anchors under anchors: key

As part of the ongoing process of making the dbt authoring language more precise, unexpected top-level keys in a YAML file will result in errors. A common use case behind these unexpected keys is standalone anchor definitions at the top level of a YAML file. You can use the new top-level anchors: key as a container for these reusable configuration blocks.

For example, rather than using this configuration:

models/_models.yml
# id_column is not a valid name for a top-level key in the dbt authoring spec, and will raise an error
id_column: &id_column_alias
name: id
description: This is a unique identifier.
data_type: int
data_tests:
- not_null
- unique

models:
- name: my_first_model
columns:
- *id_column_alias
- name: unrelated_column_a
description: This column is not repeated in other models.
- name: my_second_model
columns:
- *id_column_alias

Move the anchor under the anchors: key instead:

models/_models.yml
anchors: 
- &id_column_alias
name: id
description: This is a unique identifier.
data_type: int
data_tests:
- not_null
- unique

models:
- name: my_first_model
columns:
- *id_column_alias
- name: unrelated_column_a
description: This column is not repeated in other models
- name: my_second_model
columns:
- *id_column_alias

This move is only necessary for fragments defined outside of the main YAML structure. For more information about this new key, see anchors.

Algebraic operations in Jinja macros

In v1, you can set algebraic functions in the return function of a Jinja macro:

{% macro my_macro() %}

return('xyz') + 'abc'

{% endmacro %}

This is no longer supported in v2 and will emit a warning:

[warning] [JinjaTopLevelReturn (dbt1508)]: return is not at the top level of the block.
Its value is final and cannot be modified by surrounding expressions.
Example: return(0) + 1. The + 1 is ignored and the macro returns 0.

This is not a common use case and there is no deprecation warning for this behavior in v1. The supported format is:

{% macro my_macro() %}

return('xyzabc')

{% endmacro %}

Accessing custom configurations in meta

config.get() and config.require() don't return values from the meta dictionary. If you try to access a key that only exists in meta, dbt emits a warning:

warning: The key 'my_key' was not found using config.get('my_key'), but was 
detected as a custom config under 'meta'. Please use config.meta_get('my_key')
or config.meta_require('my_key') instead.

Behavior when a key exists only in meta:

MethodBehavior
config.get('my_key')Returns the default value and emits a warning.
config.require('my_key')Raises an error and emits a warning.
Loading table...

To access custom configurations stored under meta, use the explicit methods:

{% set owner = config.meta_get('owner') %}
{% set has_pii = config.meta_require('pii') %}

For more information, see config.meta_get() and config.meta_require().

Fusion compiler

Snowflake model functions

Fusion supports Snowflake ML model functions, which allow you to call machine learning models directly in SQL.

Because model function return types are flexible and defined by the underlying model, Fusion uses simplified type checking:

  • Arguments: Fusion accepts any arguments without strict type validation.
  • Return type: Fusion treats all model function results as VARIANT.

To use the result in your models, cast it to the expected type:

select 
my_model!predict(input_column)::float as prediction_score
from {{ ref('my_table') }}

Package support

To determine if a package is compatible with the dbt Fusion engine, visit the dbt package hub and look for the Fusion-compatible badge, or review the package's require-dbt-version configuration.

  • Packages with a require-dbt-version that equals or contains 2.0.0 are compatible with Fusion. For example, require-dbt-version: ">=1.10.0,<3.0.0".

    Even if a package doesn't reflect compatibility in the package hub, it may still work with Fusion. Work with package maintainers to track updates, and thoroughly test packages that aren't clearly compatible before deploying.

  • Package maintainers who would like to make their package compatible with Fusion can refer to the Fusion package upgrade guide for instructions.

Fivetran package considerations:

  • The Fivetran source and transformation packages have been combined into a single package.
  • If you manually installed source packages like fivetran/github_source, you need to ensure fivetran/github is installed and deactivate the transformation models.

Package compatibility messages

Inconsistent Fusion warnings and dbt-autofix logs

Fusion warnings and dbt-autofix logs may show different messages about package compatibility.

If you use dbt-autofix while upgrading to Fusion in the Studio IDE or dbt VS Code extension, you may see different messages about package compatibility between dbt-autofix and Fusion warnings.

Here's why:

  • Fusion warnings are emitted based on a package's require-dbt-version and whether require-dbt-version contains 2.0.0.
  • Some packages are already Fusion-compatible even though package maintainers haven't yet updated require-dbt-version.
  • dbt-autofix knows about these compatible packages and will not try to upgrade a package that it knows is already compatible.

This means that even if you see a Fusion warning for a package that dbt-autofix identifies as compatible, you don't need to change the package.

The message discrepancy is temporary while we implement and roll out dbt-autofix's enhanced compatibility detection to Fusion warnings.

Here's an example of a Fusion warning in the Studio IDE that says a package isn't compatible with Fusion but dbt-autofix indicates it is compatible:

dbt1065: Package 'dbt_utils' requires dbt version [>=1.30,<2.0.0], but current version is 2.0.0-preview.72. This package may not be compatible with your dbt version. dbt(1065) [Ln 1, Col 1]

Was this page helpful?

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

0
Loading