Skip to content

Commit 7915450

Browse files
Merge pull request #468 from bossenti/add-get-view-definition
implement `get_view_definition()` for AthenaDialect
2 parents 3253415 + ddd81e2 commit 7915450

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

pyathena/sqlalchemy/base.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
)
2020

2121
import botocore
22-
from sqlalchemy import exc, schema, types, util
22+
from sqlalchemy import exc, schema, text, types, util
2323
from sqlalchemy.engine import Engine, reflection
2424
from sqlalchemy.engine.default import DefaultDialect
2525
from sqlalchemy.sql.compiler import (
@@ -1102,6 +1102,20 @@ def has_table(
11021102
except exc.NoSuchTableError:
11031103
return False
11041104

1105+
@reflection.cache
1106+
def get_view_definition(
1107+
self, connection: Connection, view_name: str, schema: Optional[str] = None, **kw
1108+
) -> str:
1109+
raw_connection = self._raw_connection(connection)
1110+
schema = schema if schema else raw_connection.schema_name # type: ignore
1111+
query = f"""SHOW CREATE VIEW "{schema}"."{view_name}";"""
1112+
try:
1113+
res = connection.scalars(text(query))
1114+
except exc.OperationalError as e:
1115+
raise exc.NoSuchTableError(f"{schema}.{view_name}") from e
1116+
else:
1117+
return "\n".join([r for r in res])
1118+
11051119
@reflection.cache
11061120
def get_columns(
11071121
self, connection: "Connection", table_name: str, schema: Optional[str] = None, **kw

tests/pyathena/sqlalchemy/test_base.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1796,3 +1796,27 @@ def test_insert_from_select_cte_follows_insert_one(self, engine):
17961796
).strip()
17971797
)
17981798
assert actual == [(2, "bar")]
1799+
1800+
def test_get_view_definition(self, engine):
1801+
engine, conn = engine
1802+
insp = sqlalchemy.inspect(engine)
1803+
actual = insp.get_view_definition(schema=ENV.schema, view_name="v_one_row")
1804+
assert (
1805+
actual
1806+
== textwrap.dedent(
1807+
f"""
1808+
CREATE VIEW {ENV.schema}.v_one_row AS
1809+
SELECT number_of_rows
1810+
FROM
1811+
{ENV.schema}.one_row
1812+
"""
1813+
).strip()
1814+
)
1815+
1816+
def test_get_view_definition_missing_view(self, engine):
1817+
engine, conn = engine
1818+
insp = sqlalchemy.inspect(engine)
1819+
pytest.raises(
1820+
NoSuchTableError,
1821+
lambda: insp.get_view_definition(schema=ENV.schema, view_name="test_view"),
1822+
)

tests/resources/queries/create_table.sql.jinja2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,4 @@ CREATE EXTERNAL TABLE IF NOT EXISTS {{ schema }}.parquet_with_compression (
122122
STORED AS PARQUET
123123
LOCATION '{{ s3_staging_dir }}{{ schema }}/parquet_with_compression/'
124124
TBLPROPERTIES ('parquet.compress'='SNAPPY');
125+
CREATE OR REPLACE VIEW {{ schema }}.v_one_row AS SELECT number_of_rows FROM {{ schema }}.one_row

0 commit comments

Comments
 (0)