Skip to content

Commit c1291d4

Browse files
authored
Fix: Update dbt loader to support loading multiple models from same file (#5346)
1 parent 0c02d50 commit c1291d4

File tree

4 files changed

+40
-20
lines changed

4 files changed

+40
-20
lines changed

sqlmesh/dbt/loader.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import typing as t
66
import sqlmesh.core.dialect as d
77
from pathlib import Path
8+
from collections import defaultdict
89
from sqlmesh.core.config import (
910
Config,
1011
ConnectionConfig,
@@ -137,16 +138,22 @@ def _to_sqlmesh(config: BMC, context: DbtContext) -> Model:
137138
package_context.set_and_render_variables(package.variables, package.name)
138139
package_models: t.Dict[str, BaseModelConfig] = {**package.models, **package.seeds}
139140

141+
package_models_by_path: t.Dict[Path, t.List[BaseModelConfig]] = defaultdict(list)
140142
for model in package_models.values():
141143
if isinstance(model, ModelConfig) and not model.sql.strip():
142144
logger.info(f"Skipping empty model '{model.name}' at path '{model.path}'.")
143145
continue
146+
package_models_by_path[model.path].append(model)
144147

145-
sqlmesh_model = cache.get_or_load_models(
146-
model.path, loader=lambda: [_to_sqlmesh(model, package_context)]
147-
)[0]
148-
149-
models[sqlmesh_model.fqn] = sqlmesh_model
148+
for path, path_models in package_models_by_path.items():
149+
sqlmesh_models = cache.get_or_load_models(
150+
path,
151+
loader=lambda: [
152+
_to_sqlmesh(model, package_context) for model in path_models
153+
],
154+
)
155+
for sqlmesh_model in sqlmesh_models:
156+
models[sqlmesh_model.fqn] = sqlmesh_model
150157

151158
models.update(self._load_external_models(audits, cache))
152159

tests/dbt/test_model.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,18 @@ def test_load_microbatch_with_ref_no_filter(
733733
)
734734

735735

736+
@pytest.mark.slow
737+
def test_load_multiple_snapshots_defined_in_same_file(sushi_test_dbt_context: Context) -> None:
738+
context = sushi_test_dbt_context
739+
assert context.get_model("snapshots.items_snapshot")
740+
assert context.get_model("snapshots.items_check_snapshot")
741+
742+
# Make sure cache works too
743+
context.load()
744+
assert context.get_model("snapshots.items_snapshot")
745+
assert context.get_model("snapshots.items_check_snapshot")
746+
747+
736748
@pytest.mark.slow
737749
def test_dbt_jinja_macro_undefined_variable_error(create_empty_project):
738750
project_dir, model_dir = create_empty_project()

tests/fixtures/dbt/sushi_test/snapshots/items_check_snapshot.sql

Lines changed: 0 additions & 15 deletions
This file was deleted.

tests/fixtures/dbt/sushi_test/snapshots/items_snapshot.sql renamed to tests/fixtures/dbt/sushi_test/snapshots/items_snapshots.sql

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,19 @@
1414
select * from {{ source('streaming', 'items') }}
1515

1616
{% endsnapshot %}
17+
18+
{% snapshot items_check_snapshot %}
19+
20+
{{
21+
config(
22+
target_schema='snapshots',
23+
unique_key='id',
24+
strategy='check',
25+
check_cols=['ds'],
26+
invalidate_hard_deletes=True,
27+
)
28+
}}
29+
30+
select * from {{ source('streaming', 'items') }}
31+
32+
{% endsnapshot %}

0 commit comments

Comments
 (0)