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 9f16a7409c0 Lazy load `snowflake` imports in Snowflake provider.
(#62365)
9f16a7409c0 is described below
commit 9f16a7409c0d7beb3a0655c9b0432c2d112f7b21
Author: Daniel Reeves <[email protected]>
AuthorDate: Tue Mar 3 17:10:34 2026 -0500
Lazy load `snowflake` imports in Snowflake provider. (#62365)
---
.../src/airflow/providers/snowflake/hooks/snowflake.py | 15 +++++++++++----
.../tests/unit/snowflake/hooks/test_snowflake.py | 10 +++++-----
2 files changed, 16 insertions(+), 9 deletions(-)
diff --git
a/providers/snowflake/src/airflow/providers/snowflake/hooks/snowflake.py
b/providers/snowflake/src/airflow/providers/snowflake/hooks/snowflake.py
index a71ac283646..6d14c24f1c0 100644
--- a/providers/snowflake/src/airflow/providers/snowflake/hooks/snowflake.py
+++ b/providers/snowflake/src/airflow/providers/snowflake/hooks/snowflake.py
@@ -34,9 +34,6 @@ from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from requests.auth import HTTPBasicAuth
from requests.exceptions import ConnectionError, HTTPError, Timeout
-from snowflake import connector
-from snowflake.connector import DictCursor, SnowflakeConnection, util_text
-from snowflake.sqlalchemy import URL
from sqlalchemy import create_engine
from airflow.providers.common.compat.sdk import (
@@ -57,6 +54,8 @@ T = TypeVar("T")
if TYPE_CHECKING:
+ from snowflake.connector import SnowflakeConnection
+
from airflow.providers.openlineage.extractors import OperatorLineage
from airflow.providers.openlineage.sqlparser import DatabaseInfo
@@ -583,6 +582,8 @@ class SnowflakeHook(DbApiHook):
return self._conn_params_to_sqlalchemy_uri(conn_params)
def _conn_params_to_sqlalchemy_uri(self, conn_params: dict) -> str:
+ from snowflake.sqlalchemy import URL
+
return URL(
**{
k: v
@@ -607,8 +608,10 @@ class SnowflakeHook(DbApiHook):
def get_conn(self) -> SnowflakeConnection:
"""Return a snowflake.connection object."""
+ from snowflake.connector import connect
+
conn_config = self._get_conn_params()
- conn = connector.connect(**conn_config)
+ conn = connect(**conn_config)
return conn
def get_sqlalchemy_engine(self, engine_kwargs=None):
@@ -722,6 +725,8 @@ class SnowflakeHook(DbApiHook):
:return: Result of the last SQL statement if *handler* is set.
*None* otherwise.
"""
+ from snowflake.connector import util_text
+
self.query_ids = []
if isinstance(sql, str):
@@ -776,6 +781,8 @@ class SnowflakeHook(DbApiHook):
@contextmanager
def _get_cursor(self, conn: Any, return_dictionaries: bool):
+ from snowflake.connector import DictCursor
+
cursor = None
try:
if return_dictionaries:
diff --git a/providers/snowflake/tests/unit/snowflake/hooks/test_snowflake.py
b/providers/snowflake/tests/unit/snowflake/hooks/test_snowflake.py
index da10a1efd72..9feda776510 100644
--- a/providers/snowflake/tests/unit/snowflake/hooks/test_snowflake.py
+++ b/providers/snowflake/tests/unit/snowflake/hooks/test_snowflake.py
@@ -756,12 +756,12 @@ class TestPytestSnowflakeHook:
mock.patch.dict(
"os.environ",
AIRFLOW_CONN_TEST_CONN=Connection(**BASE_CONNECTION_KWARGS).get_uri()
),
-
mock.patch("airflow.providers.snowflake.hooks.snowflake.connector") as
mock_connector,
+ mock.patch("snowflake.connector.connect") as mock_connect,
):
hook = SnowflakeHook(snowflake_conn_id="test_conn")
conn = hook.get_conn()
-
mock_connector.connect.assert_called_once_with(**hook._get_conn_params())
- assert mock_connector.connect.return_value == conn
+ mock_connect.assert_called_once_with(**hook._get_conn_params())
+ assert mock_connect.return_value == conn
def test_get_sqlalchemy_engine_should_support_pass_auth(self):
with (
@@ -1503,12 +1503,12 @@ class TestPytestSnowflakeHook:
with (
mock.patch.dict("os.environ",
AIRFLOW_CONN_TEST_CONN=Connection(**connection_kwargs).get_uri()),
-
mock.patch("airflow.providers.snowflake.hooks.snowflake.connector") as
mock_connector,
+ mock.patch("snowflake.connector.connect") as mock_connect,
):
hook = SnowflakeHook(snowflake_conn_id="test_conn")
hook.get_conn()
- call_args = mock_connector.connect.call_args[1]
+ call_args = mock_connect.call_args[1]
assert call_args["proxy_host"] == "proxy.example.com"
assert call_args["proxy_port"] == 8080
assert call_args["proxy_user"] == "proxy_user"