Skip to content

Commit 3c5122a

Browse files
authored
Fix: external model schema was using generic model name the key. sqlglot is lenient enough to accept double quotes instead of backticks for dialects like bigquery, but this makes the schema.yaml more consistent (#1658)
1 parent 258e31a commit 3c5122a

3 files changed

Lines changed: 25 additions & 7 deletions

File tree

sqlmesh/core/model/definition.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1797,7 +1797,9 @@ def _create_model(
17971797
"jinja_macros": jinja_macros,
17981798
"dialect": dialect,
17991799
"depends_on": depends_on,
1800-
"physical_schema_override": physical_schema_override.get(exp.to_table(name).db),
1800+
"physical_schema_override": physical_schema_override.get(
1801+
exp.to_table(name, dialect=dialect).db
1802+
),
18011803
**kwargs,
18021804
},
18031805
)

sqlmesh/core/schema_loader.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from concurrent.futures import ThreadPoolExecutor
66
from pathlib import Path
77

8+
from sqlglot import exp
89
from sqlglot.dialects.dialect import DialectType
910

1011
from sqlmesh.core.engine_adapter import EngineAdapter
@@ -63,7 +64,7 @@ def _get_columns(table: str) -> t.Optional[t.Dict[str, t.Any]]:
6364

6465
schemas = [
6566
{
66-
"name": table,
67+
"name": exp.to_table(table).sql(dialect=dialect),
6768
"columns": {c: t.sql(dialect=dialect) for c, t in columns.items()},
6869
}
6970
for table, columns in sorted(

tests/core/test_schema_loader.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from sqlmesh.core.config import Config, DuckDBConnectionConfig, GatewayConfig
1111
from sqlmesh.core.context import Context
1212
from sqlmesh.core.dialect import parse
13-
from sqlmesh.core.model import SqlModel, load_sql_based_model
13+
from sqlmesh.core.model import SqlModel, create_external_model, load_sql_based_model
1414
from sqlmesh.core.schema_loader import create_schema_file
1515
from sqlmesh.core.snapshot import SnapshotChangeCategory
1616
from sqlmesh.utils.yaml import YAML
@@ -108,17 +108,32 @@ def test_no_internal_model_conversion(tmp_path: Path, mocker: MockerFixture):
108108
state_reader_mock = mocker.Mock()
109109
state_reader_mock.nodes_exist.return_value = {"model_b"}
110110

111-
model = SqlModel(name="a", query=parse_one("select * FROM model_b, tbl_c"))
111+
model_a = SqlModel(name="a", query=parse_one("select * FROM model_b, tbl_c"))
112+
model_b = SqlModel(name="b", query=parse_one("select * FROM `tbl-d`", read="bigquery"))
112113

113114
schema_file = tmp_path / c.SCHEMA_YAML
114-
create_schema_file(schema_file, {"a": model}, engine_adapter_mock, state_reader_mock, "")
115+
create_schema_file(
116+
schema_file,
117+
{
118+
"a": model_a,
119+
"b": model_b,
120+
},
121+
engine_adapter_mock,
122+
state_reader_mock,
123+
"bigquery",
124+
)
115125

116126
with open(schema_file, "r") as fd:
117127
schema = YAML().load(fd)
118128

119-
assert len(schema) == 1
120-
assert schema[0]["name"] == "tbl_c"
129+
assert len(schema) == 2
130+
assert schema[0]["name"] == "`tbl-d`"
121131
assert list(schema[0]["columns"]) == ["b", "a"]
132+
assert schema[1]["name"] == "tbl_c"
133+
assert list(schema[1]["columns"]) == ["b", "a"]
134+
135+
for row in schema:
136+
create_external_model(**row, dialect="bigquery")
122137

123138

124139
def test_missing_table(tmp_path: Path):

0 commit comments

Comments
 (0)