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

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 9b1be609c46 Add SQLAlchemy dependency to Exasol provider (#59902) 
(#59915)
9b1be609c46 is described below

commit 9b1be609c46f9932f3b5b3c627fac4706b3d9cb5
Author: Jason K Hall <[email protected]>
AuthorDate: Wed Dec 31 16:35:56 2025 -0700

    Add SQLAlchemy dependency to Exasol provider (#59902) (#59915)
    
    * Fix: Make sqlalchemy optional in Exasol provider
    
    * Update providers/exasol/pyproject.toml
    
    Co-authored-by: Jarek Potiuk <[email protected]>
    
    ---------
    
    Co-authored-by: Jarek Potiuk <[email protected]>
---
 providers/exasol/pyproject.toml                          |  7 +++++++
 .../exasol/src/airflow/providers/exasol/hooks/exasol.py  | 16 ++++++++++++++--
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/providers/exasol/pyproject.toml b/providers/exasol/pyproject.toml
index 2c41a954f36..78478aa0f09 100644
--- a/providers/exasol/pyproject.toml
+++ b/providers/exasol/pyproject.toml
@@ -65,6 +65,13 @@ dependencies = [
     'pandas>=2.2.3; python_version >="3.13"',
 ]
 
+# The optional dependencies should be modified in place in the generated file
+# Any change in the dependencies is preserved when the file is regenerated
+[project.optional-dependencies]
+sqlalchemy = [
+    "sqlalchemy>=1.4.49",
+]
+
 [dependency-groups]
 dev = [
     "apache-airflow",
diff --git a/providers/exasol/src/airflow/providers/exasol/hooks/exasol.py 
b/providers/exasol/src/airflow/providers/exasol/hooks/exasol.py
index 417ee56b1de..cf2aa1629c9 100644
--- a/providers/exasol/src/airflow/providers/exasol/hooks/exasol.py
+++ b/providers/exasol/src/airflow/providers/exasol/hooks/exasol.py
@@ -24,9 +24,13 @@ from typing import TYPE_CHECKING, Any, TypeVar, overload
 import pyexasol
 from deprecated import deprecated
 from pyexasol import ExaConnection, ExaStatement
-from sqlalchemy.engine import URL
 
-from airflow.exceptions import AirflowProviderDeprecationWarning
+try:
+    from sqlalchemy.engine import URL
+except ImportError:
+    URL = None
+
+from airflow.exceptions import AirflowOptionalProviderFeatureException, 
AirflowProviderDeprecationWarning
 from airflow.providers.common.sql.hooks.handlers import 
return_single_query_results
 from airflow.providers.common.sql.hooks.sql import DbApiHook
 
@@ -96,6 +100,10 @@ class ExasolHook(DbApiHook):
 
         :return: the extracted sqlalchemy.engine.URL object.
         """
+        if URL is None:
+            raise AirflowOptionalProviderFeatureException(
+                "The 'sqlalchemy' library is required to use 'sqlalchemy_url'."
+            )
         connection = self.connection
         query = connection.extra_dejson
         query = {k: v for k, v in query.items() if k.lower() != 
"sqlalchemy_scheme"}
@@ -115,6 +123,10 @@ class ExasolHook(DbApiHook):
 
         :return: the extracted uri.
         """
+        if URL is None:
+            raise AirflowOptionalProviderFeatureException(
+                "The 'sqlalchemy' library is required to render the connection 
URI."
+            )
         return self.sqlalchemy_url.render_as_string(hide_password=False)
 
     def _get_pandas_df(

Reply via email to