From eeba326f8b892b2aae4aa13ae49aa9da5c9b0f38 Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Mon, 26 Jul 2021 17:45:48 -0700 Subject: [PATCH] chore: set UUID of examples DB (#15724) --- superset/commands/importers/v1/examples.py | 21 ++++++++++++------- superset/constants.py | 4 ++++ .../examples/users_channels-uzooNNtSRO.yaml | 2 +- superset/utils/core.py | 10 ++++++++- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/superset/commands/importers/v1/examples.py b/superset/commands/importers/v1/examples.py index 1571a212d6..f84f5296b5 100644 --- a/superset/commands/importers/v1/examples.py +++ b/superset/commands/importers/v1/examples.py @@ -70,7 +70,7 @@ class ImportExamplesCommand(ImportModelsCommand): db.session.rollback() raise self.import_error() - # pylint: disable=too-many-locals, arguments-differ + # pylint: disable=too-many-locals, arguments-differ, too-many-branches @staticmethod def _import( session: Session, @@ -86,16 +86,23 @@ class ImportExamplesCommand(ImportModelsCommand): database_ids[str(database.uuid)] = database.id # import datasets - # TODO (betodealmeida): once we have all examples being imported we can - # have a stable UUID for the database stored in the dataset YAML; for - # now we need to fetch the current ID. - examples_id = ( - db.session.query(Database).filter_by(database_name="examples").one().id + # If database_uuid is not in the list of UUIDs it means that the examples + # database was created before its UUID was frozen, so it has a random UUID. + # We need to determine its ID so we can point the dataset to it. + examples_db = ( + db.session.query(Database).filter_by(database_name="examples").first() ) dataset_info: Dict[str, Dict[str, Any]] = {} for file_name, config in configs.items(): if file_name.startswith("datasets/"): - config["database_id"] = examples_id + # find the ID of the corresponding database + if config["database_uuid"] not in database_ids: + if examples_db is None: + raise Exception("Cannot find examples database") + config["database_id"] = examples_db.id + else: + config["database_id"] = database_ids[config["database_uuid"]] + dataset = import_dataset( session, config, overwrite=overwrite, force_data=force_data ) diff --git a/superset/constants.py b/superset/constants.py index a4f0ad133b..7defc34d09 100644 --- a/superset/constants.py +++ b/superset/constants.py @@ -21,6 +21,10 @@ NULL_STRING = "" +# UUID for the examples database +EXAMPLES_DB_UUID = "a2dc77af-e654-49bb-b321-40f6b559a1ee" + + class RouteMethod: # pylint: disable=too-few-public-methods """ Route methods are a FAB concept around ModelView and RestModelView diff --git a/superset/examples/configs/datasets/examples/users_channels-uzooNNtSRO.yaml b/superset/examples/configs/datasets/examples/users_channels-uzooNNtSRO.yaml index f54d061def..152ca32867 100644 --- a/superset/examples/configs/datasets/examples/users_channels-uzooNNtSRO.yaml +++ b/superset/examples/configs/datasets/examples/users_channels-uzooNNtSRO.yaml @@ -73,4 +73,4 @@ columns: description: null python_date_format: null version: 1.0.0 -database_uuid: 566ca280-3da8-967e-4aa4-4b349218736a +database_uuid: a2dc77af-e654-49bb-b321-40f6b559a1ee diff --git a/superset/utils/core.py b/superset/utils/core.py index 4371640cc5..0c4c18fe02 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -85,6 +85,7 @@ from typing_extensions import TypedDict import _thread # pylint: disable=C0411 from superset.constants import ( + EXAMPLES_DB_UUID, EXTRA_FORM_DATA_APPEND_KEYS, EXTRA_FORM_DATA_OVERRIDE_EXTRA_KEYS, EXTRA_FORM_DATA_OVERRIDE_REGULAR_MAPPINGS, @@ -1168,9 +1169,16 @@ def get_or_create_db( db.session.query(models.Database).filter_by(database_name=database_name).first() ) + # databases with a fixed UUID + uuids = { + "examples": EXAMPLES_DB_UUID, + } + if not database and always_create: logger.info("Creating database reference for %s", database_name) - database = models.Database(database_name=database_name) + database = models.Database( + database_name=database_name, uuid=uuids.get(database_name) + ) db.session.add(database) if database: