From 223b72f0cd8049762be928efe4206cc74edc686f Mon Sep 17 00:00:00 2001 From: jonasHanhan <130035609+jonasHanhan@users.noreply.github.com> Date: Sat, 13 Apr 2024 00:00:45 +0800 Subject: [PATCH] =?UTF-8?q?fix(ingestion/lite):=20An=20index=20with=20the?= =?UTF-8?q?=20name=20aspect=5Fidxalready=20exists=20=E2=80=A6=20(#10267)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/datahub/lite/duckdb_lite.py | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/metadata-ingestion/src/datahub/lite/duckdb_lite.py b/metadata-ingestion/src/datahub/lite/duckdb_lite.py index 0cc979fa67..f40a2e9498 100644 --- a/metadata-ingestion/src/datahub/lite/duckdb_lite.py +++ b/metadata-ingestion/src/datahub/lite/duckdb_lite.py @@ -55,20 +55,34 @@ class DuckDBLite(DataHubLiteLocal[DuckDBLiteConfig]): if not config.read_only: self._init_db() - def _init_db(self): + def _create_unique_index( + self, index_name: str, table_name: str, columns: list + ) -> None: + try: + self.duckdb_client.execute( + f"CREATE UNIQUE INDEX {index_name} ON {table_name} ({', '.join(columns)})" + ) + except duckdb.CatalogException as e: + if "already exists" not in str(e).lower(): + raise + + def _init_db(self) -> None: self.duckdb_client.execute( "CREATE TABLE IF NOT EXISTS metadata_aspect_v2 " "(urn VARCHAR, aspect_name VARCHAR, version BIGINT, metadata JSON, system_metadata JSON, createdon BIGINT)" ) - self.duckdb_client.execute( - "CREATE UNIQUE INDEX IF NOT EXISTS aspect_idx ON metadata_aspect_v2 (urn, aspect_name, version)" + + self._create_unique_index( + "aspect_idx", "metadata_aspect_v2", ["urn", "aspect_name", "version"] ) + self.duckdb_client.execute( "CREATE TABLE IF NOT EXISTS metadata_edge_v2 " "(src_id VARCHAR, relnship VARCHAR, dst_id VARCHAR, dst_label VARCHAR)" ) - self.duckdb_client.execute( - "CREATE UNIQUE INDEX IF NOT EXISTS edge_idx ON metadata_edge_v2 (src_id, relnship, dst_id)" + + self._create_unique_index( + "edge_idx", "metadata_edge_v2", ["src_id", "relnship", "dst_id"] ) def location(self) -> str: