diff --git a/superset/databases/utils.py b/superset/databases/utils.py index c28c3e85c..4d475177f 100644 --- a/superset/databases/utils.py +++ b/superset/databases/utils.py @@ -73,6 +73,7 @@ def get_table_metadata( indexes = get_indexes_metadata(database, table_name, schema_name) keys += foreign_keys + indexes payload_columns: List[Dict[str, Any]] = [] + table_comment = database.get_table_comment(table_name, schema_name) for col in columns: dtype = get_col_type(col) payload_columns.append( @@ -81,6 +82,7 @@ def get_table_metadata( "type": dtype.split("(")[0] if "(" in dtype else dtype, "longType": dtype, "keys": [k for k in keys if col["name"] in k["column_names"]], + "comment": col.get("comment"), } ) return { @@ -97,4 +99,5 @@ def get_table_metadata( "primaryKey": primary_key, "foreignKeys": foreign_keys, "indexes": keys, + "comment": table_comment, } diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index 502cd6e06..f924ade58 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -655,6 +655,30 @@ class BaseEngineSpec: # pylint: disable=too-many-public-methods views = [re.sub(f"^{schema}\\.", "", view) for view in views] return sorted(views) + @classmethod + def get_table_comment( + cls, inspector: Inspector, table_name: str, schema: Optional[str] + ) -> Optional[str]: + """ + Get comment of table from a given schema and table + + :param inspector: SqlAlchemy Inspector instance + :param table_name: Table name + :param schema: Schema name. If omitted, uses default schema for database + :return: comment of table + """ + comment = None + try: + comment = inspector.get_table_comment(table_name, schema) + comment = comment.get("text") if isinstance(comment, dict) else None + except NotImplementedError: + # It's expected that some dialects don't implement the comment method + pass + except Exception as ex: # pylint: disable=broad-except + logger.error("Unexpected error while fetching table comment") + logger.exception(ex) + return comment + @classmethod def get_columns( cls, inspector: Inspector, table_name: str, schema: Optional[str] diff --git a/superset/models/core.py b/superset/models/core.py index 775a9f09d..4379a2034 100755 --- a/superset/models/core.py +++ b/superset/models/core.py @@ -611,6 +611,11 @@ class Database( autoload_with=self.get_sqla_engine(), ) + def get_table_comment( + self, table_name: str, schema: Optional[str] = None + ) -> Optional[str]: + return self.db_engine_spec.get_table_comment(self.inspector, table_name, schema) + def get_columns( self, table_name: str, schema: Optional[str] = None ) -> List[Dict[str, Any]]: diff --git a/tests/databases/api_tests.py b/tests/databases/api_tests.py index 9dafb87f2..0e965d74e 100644 --- a/tests/databases/api_tests.py +++ b/tests/databases/api_tests.py @@ -500,6 +500,7 @@ class TestDatabaseApi(SupersetTestCase): self.assertEqual(rv.status_code, 200) response = json.loads(rv.data.decode("utf-8")) self.assertEqual(response["name"], "birth_names") + self.assertIsNone(response["comment"]) self.assertTrue(len(response["columns"]) > 5) self.assertTrue(response.get("selectStar").startswith("SELECT"))