You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by be...@apache.org on 2023/03/21 21:57:55 UTC

[superset] 01/01: feat: get_catalog_names

This is an automated email from the ASF dual-hosted git repository.

beto pushed a commit to branch list_catalogs
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 0c40e0792762968ee8008aa03b94e856b9b2c949
Author: Beto Dealmeida <ro...@dealmeida.net>
AuthorDate: Tue Mar 21 14:57:42 2023 -0700

    feat: get_catalog_names
---
 superset/db_engine_specs/base.py     | 22 ++++++++++++++++++++++
 superset/db_engine_specs/postgres.py | 20 ++++++++++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py
index b8b1662057..833e5f5b60 100644
--- a/superset/db_engine_specs/base.py
+++ b/superset/db_engine_specs/base.py
@@ -374,6 +374,14 @@ class BaseEngineSpec:  # pylint: disable=too-many-public-methods
     # a custom `adjust_engine_params` method.
     supports_dynamic_schema = False
 
+    # Does the DB support catalogs? A catalog here is a group of schemas, and has different
+    # names depending on the DB: BigQuery calles it a "project", Postgres calls it a
+    # "database", Trino calls it a "catalog", etc.
+    supports_catalog = False
+
+    # Can the catalog be changed on a per-query basis?
+    supports_dynamic_catalog = False
+
     @classmethod
     def supports_url(cls, url: URL) -> bool:
         """
@@ -1091,6 +1099,20 @@ class BaseEngineSpec:  # pylint: disable=too-many-public-methods
         TODO: Improve docstring and refactor implementation in Hive
         """
 
+    @classmethod
+    def get_catalog_names(
+        cls,
+        database: Database,
+        inspect: Inspector,
+    ) -> List[str]:
+        """
+        Get all catalogs from database.
+
+        This needs to be implemented per database, since SQLAlchemy doesn't offer an
+        abstraction.
+        """
+        return []
+
     @classmethod
     def get_schema_names(cls, inspector: Inspector) -> List[str]:
         """
diff --git a/superset/db_engine_specs/postgres.py b/superset/db_engine_specs/postgres.py
index fac0b1b1d0..69e9720b68 100644
--- a/superset/db_engine_specs/postgres.py
+++ b/superset/db_engine_specs/postgres.py
@@ -291,6 +291,26 @@ class PostgresEngineSpec(PostgresBaseEngineSpec, BasicParametersMixin):
     ) -> List[Dict[str, str]]:
         return [{k: str(v) for k, v in row.items()} for row in raw_cost]
 
+    @classmethod
+    def get_catalog_names(
+        cls,
+        database: Database,
+        inspect: Inspector,
+    ) -> List[str]:
+        """
+        Return all catalogs.
+
+        In Postgres, a catalog is called a "database".
+        """
+        return sorted(
+            inspector.bind.execute(
+                """
+SELECT datname FROM pg_database
+WHERE datistemplate = false;
+            """
+            ).fetchall()
+        )
+
     @classmethod
     def get_table_names(
         cls, database: "Database", inspector: PGInspector, schema: Optional[str]