33from __future__ import annotations
44
55import importlib
6+ import importlib .util
67from abc import ABC , abstractmethod
78from dataclasses import dataclass
89from pathlib import Path
@@ -74,6 +75,36 @@ class SequenceInfo:
7475TableInfo = tuple [str , str ]
7576
7677
78+ def import_driver_module (
79+ module_name : str ,
80+ * ,
81+ driver_name : str ,
82+ extra_name : str | None ,
83+ package_name : str | None ,
84+ ) -> Any :
85+ """Import a driver module, raising MissingDriverError with detail if it fails."""
86+ if not extra_name or not package_name :
87+ return importlib .import_module (module_name )
88+
89+ if importlib .util .find_spec (module_name ) is None :
90+ from ...db .exceptions import MissingDriverError
91+
92+ raise MissingDriverError (driver_name , extra_name , package_name , module_name = module_name )
93+
94+ try :
95+ return importlib .import_module (module_name )
96+ except ImportError as e :
97+ from ...db .exceptions import MissingDriverError
98+
99+ raise MissingDriverError (
100+ driver_name ,
101+ extra_name ,
102+ package_name ,
103+ module_name = module_name ,
104+ import_error = str (e ),
105+ ) from e
106+
107+
77108class DatabaseAdapter (ABC ):
78109 """Abstract base class for database adapters.
79110
@@ -97,15 +128,13 @@ def ensure_driver_available(self) -> None:
97128 """Verify required dependencies can be imported, raising MissingDriverError if not."""
98129 if not self .driver_import_names :
99130 return
100- try :
101- for module_name in self .driver_import_names :
102- importlib .import_module (module_name )
103- except ImportError as e :
104- from ...db .exceptions import MissingDriverError
105-
106- if not self .install_extra or not self .install_package :
107- raise e
108- raise MissingDriverError (self .name , self .install_extra , self .install_package ) from e
131+ for module_name in self .driver_import_names :
132+ import_driver_module (
133+ module_name ,
134+ driver_name = self .name ,
135+ extra_name = self .install_extra ,
136+ package_name = self .install_package ,
137+ )
109138
110139 @property
111140 def install_extra (self ) -> str | None :
0 commit comments