From 48741efebf2d9a539c188403aed16bc79f2fb689 Mon Sep 17 00:00:00 2001 From: Iaroslav Zeigerman Date: Thu, 14 Aug 2025 15:18:23 -0700 Subject: [PATCH] Fix: Warn instead of fail on incompatible incremental strategy for dbt models with a unique key --- sqlmesh/dbt/model.py | 7 ++++--- tests/dbt/test_transformation.py | 29 ++++++++++------------------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/sqlmesh/dbt/model.py b/sqlmesh/dbt/model.py index 4198fabca7..e35d8c16f4 100644 --- a/sqlmesh/dbt/model.py +++ b/sqlmesh/dbt/model.py @@ -293,10 +293,11 @@ def model_kind(self, context: DbtContext) -> ModelKind: self.incremental_strategy and strategy not in INCREMENTAL_BY_UNIQUE_KEY_STRATEGIES ): - raise ConfigError( - f"{self.canonical_name(context)}: SQLMesh incremental by unique key strategy is not compatible with '{strategy}'" - f" incremental strategy. Supported strategies include {collection_to_str(INCREMENTAL_BY_UNIQUE_KEY_STRATEGIES)}." + get_console().log_warning( + f"Unique key is not compatible with '{strategy}' incremental strategy in model '{self.canonical_name(context)}'. " + f"Supported strategies include {collection_to_str(INCREMENTAL_BY_UNIQUE_KEY_STRATEGIES)}. Falling back to 'merge' strategy." ) + strategy = "merge" if self.incremental_predicates: dialect = self.dialect(context) diff --git a/tests/dbt/test_transformation.py b/tests/dbt/test_transformation.py index aa5f9ab699..c67621b206 100644 --- a/tests/dbt/test_transformation.py +++ b/tests/dbt/test_transformation.py @@ -238,6 +238,16 @@ def test_model_kind(): auto_restatement_cron="0 0 * * *", ) + # Test incompatibile incremental strategies + for incremental_strategy in ("delete+insert", "insert_overwrite", "append"): + assert ModelConfig( + materialized=Materialization.INCREMENTAL, + unique_key=["bar"], + incremental_strategy=incremental_strategy, + ).model_kind(context) == IncrementalByUniqueKeyKind( + unique_key=["bar"], dialect="duckdb", forward_only=True, disable_restatement=False + ) + assert ModelConfig( materialized=Materialization.INCREMENTAL, time_column="foo", incremental_strategy="merge" ).model_kind(context) == IncrementalByTimeRangeKind( @@ -372,25 +382,6 @@ def test_model_kind(): == ManagedKind() ) - with pytest.raises(ConfigError): - ModelConfig( - materialized=Materialization.INCREMENTAL, - unique_key=["bar"], - incremental_strategy="delete+insert", - ).model_kind(context) - with pytest.raises(ConfigError): - ModelConfig( - materialized=Materialization.INCREMENTAL, - unique_key=["bar"], - incremental_strategy="insert_overwrite", - ).model_kind(context) - with pytest.raises(ConfigError): - ModelConfig( - materialized=Materialization.INCREMENTAL, - unique_key=["bar"], - incremental_strategy="append", - ).model_kind(context) - def test_model_kind_snapshot_bigquery(): context = DbtContext()