From bee2feae1a0f9cca9c88de899c9a081c4d0c2a80 Mon Sep 17 00:00:00 2001 From: NewSmoke38 Date: Mon, 29 Dec 2025 23:46:25 +0000 Subject: [PATCH] Fix: Make sqlalchemy optional in Drill provider Handle ImportError and raise AirflowOptionalProviderFeatureException when a method needs sqlalchemy. --- .../airflow/providers/apache/drill/hooks/drill.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/providers/apache/drill/src/airflow/providers/apache/drill/hooks/drill.py b/providers/apache/drill/src/airflow/providers/apache/drill/hooks/drill.py index 8a92724979f15..a1fa7ccb1b837 100644 --- a/providers/apache/drill/src/airflow/providers/apache/drill/hooks/drill.py +++ b/providers/apache/drill/src/airflow/providers/apache/drill/hooks/drill.py @@ -19,8 +19,11 @@ from collections.abc import Iterable from typing import TYPE_CHECKING, Any, NoReturn - -from sqlalchemy import create_engine +from airflow.exceptions import AirflowOptionalProviderFeatureException +try: + from sqlalchemy import create_engine +except ImportError: + create_engine = None from airflow.providers.common.sql.hooks.sql import DbApiHook @@ -52,6 +55,11 @@ class DrillHook(DbApiHook): def get_conn(self) -> PoolProxiedConnection: """Establish a connection to Drillbit.""" conn_md = self.get_connection(self.get_conn_id()) + + if create_engine is None: + + raise AirflowOptionalProviderFeatureException("The 'sqlalchemy' library is required to use this hook.") + creds = f"{conn_md.login}:{conn_md.password}@" if conn_md.login else "" database_url = ( f"{conn_md.extra_dejson.get('dialect_driver', 'drill+sadrill')}://{creds}"