Skip to content

Commit acf7f7e

Browse files
authored
Feat(dbt): Add support for adapter.rename_relation (#5188)
1 parent 2592c5c commit acf7f7e

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

docs/integrations/dbt.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ SQLMesh supports running dbt projects using the majority of dbt jinja methods, i
355355
| builtins | modules | source | |
356356
| config | print | statement | |
357357

358-
\* `adapter.rename_relation` and `adapter.expand_target_column_types` are not currently supported.
358+
\* `adapter.expand_target_column_types` is not currently supported.
359359

360360
## Unsupported dbt jinja methods
361361

@@ -364,7 +364,6 @@ The dbt jinja methods that are not currently supported are:
364364
* debug
365365
* selected_sources
366366
* adapter.expand_target_column_types
367-
* adapter.rename_relation
368367
* graph.nodes.values
369368
* graph.metrics.values
370369

sqlmesh/dbt/adapter.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
if t.TYPE_CHECKING:
1717
import agate
18-
import pandas as pd
1918
from dbt.adapters.base import BaseRelation
2019
from dbt.adapters.base.column import Column
2120
from dbt.adapters.base.impl import AdapterResponse
@@ -86,6 +85,10 @@ def drop_schema(self, relation: BaseRelation) -> None:
8685
def drop_relation(self, relation: BaseRelation) -> None:
8786
"""Drops a relation (table) in the target database."""
8887

88+
@abc.abstractmethod
89+
def rename_relation(self, from_relation: BaseRelation, to_relation: BaseRelation) -> None:
90+
"""Renames a relation (table) in the target database."""
91+
8992
@abc.abstractmethod
9093
def execute(
9194
self, sql: str, auto_begin: bool = False, fetch: bool = False
@@ -210,6 +213,9 @@ def drop_schema(self, relation: BaseRelation) -> None:
210213
def drop_relation(self, relation: BaseRelation) -> None:
211214
self._raise_parsetime_adapter_call_error("drop relation")
212215

216+
def rename_relation(self, from_relation: BaseRelation, to_relation: BaseRelation) -> None:
217+
self._raise_parsetime_adapter_call_error("rename relation")
218+
213219
def execute(
214220
self, sql: str, auto_begin: bool = False, fetch: bool = False
215221
) -> t.Tuple[AdapterResponse, agate.Table]:
@@ -349,6 +355,12 @@ def drop_relation(self, relation: BaseRelation) -> None:
349355
if relation.schema is not None and relation.identifier is not None:
350356
self.engine_adapter.drop_table(self._normalize(self._relation_to_table(relation)))
351357

358+
def rename_relation(self, from_relation: BaseRelation, to_relation: BaseRelation) -> None:
359+
old_table_name = self._normalize(self._relation_to_table(from_relation))
360+
new_table_name = self._normalize(self._relation_to_table(to_relation))
361+
362+
self.engine_adapter.rename_table(old_table_name, new_table_name)
363+
352364
def execute(
353365
self, sql: str, auto_begin: bool = False, fetch: bool = False
354366
) -> t.Tuple[AdapterResponse, agate.Table]:

tests/dbt/test_adapter.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,19 @@ def test_adapter_relation(sushi_test_project: Project, runtime_renderer: t.Calla
8181
== "[]"
8282
)
8383

84+
renderer("""
85+
{%- set old_relation = adapter.get_relation(
86+
database=None,
87+
schema='foo',
88+
identifier='bar') -%}
89+
90+
{%- set backup_relation = api.Relation.create(schema='foo', identifier='bar__backup') -%}
91+
92+
{% do adapter.rename_relation(old_relation, backup_relation) %}
93+
""")
94+
assert not engine_adapter.table_exists("foo.bar")
95+
assert engine_adapter.table_exists("foo.bar__backup")
96+
8497

8598
def test_bigquery_get_columns_in_relation(
8699
sushi_test_project: Project,

0 commit comments

Comments
 (0)