99
1010 dbt .adapters .factory .get_adapter = lambda config : config .adapter # pyright: ignore[reportUnknownLambdaType]
1111
12+ import atexit
1213import contextlib
1314import json
1415import logging
@@ -66,7 +67,7 @@ def _get_profiles_dir(project_dir: Path | str | None = None) -> Path:
6667DEFAULT_PROJECT_DIR = str (_get_project_dir ())
6768
6869
69- @dataclass
70+ @dataclass ( frozen = True )
7071class DbtConfiguration :
7172 """Minimal dbt configuration."""
7273
@@ -87,11 +88,6 @@ class DbtConfiguration:
8788 which : str = "zezima was here"
8889 REQUIRE_RESOURCE_NAMES_WITHOUT_SPACES : bool = field (default_factory = bool )
8990
90- def __post_init__ (self ) -> None :
91- """Post-init validation and cleanup."""
92- if self .target == "" :
93- self .target = None
94-
9591
9692@dataclass
9793class ExecutionResult :
@@ -142,6 +138,7 @@ def __init__(
142138 vars = vars or {},
143139 )
144140
141+ set_from_args (self ._args , None ) # pyright: ignore[reportArgumentType]
145142 self .runtime_config : RuntimeConfig = RuntimeConfig .from_args (self ._args )
146143
147144 self ._adapter : BaseAdapter | None = None
@@ -265,14 +262,17 @@ def pool(self) -> ThreadPoolExecutor:
265262 raise RuntimeError ("Thread pool not initialized" )
266263 return self ._pool
267264
268- def _initialize_adapter (self , replace : bool = False ) -> None :
265+ def _initialize_adapter (self , replace : bool = False , verify_connectivity : bool = True ) -> None :
269266 """Initialize or reinitialize the adapter."""
270267 if self ._adapter is not None :
271268 if not replace :
272269 return
273270 with contextlib .suppress (Exception ):
271+ if self ._pool :
272+ self ._pool .shutdown (wait = True , cancel_futures = True )
273+ self ._pool = None
274274 self ._adapter .connections .cleanup_all ()
275- self . _pool = None
275+ _ = atexit . unregister ( self . _adapter . connections . cleanup_all )
276276
277277 adapter_cls = get_adapter_class_by_name (self .runtime_config .credentials .type )
278278 try :
@@ -283,14 +283,18 @@ def _initialize_adapter(self, replace: bool = False) -> None:
283283 except ValueError :
284284 self ._adapter = t .cast (BaseAdapter , adapter_cls (self .runtime_config )) # pyright: ignore[reportInvalidCast]
285285
286- with self ._adapter .connection_named ("master" ):
287- self ._adapter .debug_query ()
286+ if verify_connectivity :
287+ with self ._adapter .connection_named ("dbt-core-interface" ):
288+ self ._adapter .debug_query ()
288289
289290 logger .debug (f"Initialized adapter for { self .project_name } " )
290291 self .runtime_config .adapter = self ._adapter # pyright: ignore[reportAttributeAccessIssue]
291292 self .__manifest_loader .macro_hook = self ._adapter .connections .set_query_header # pyright: ignore[reportAttributeAccessIssue]
292293 self ._adapter .set_macro_context_generator (generate_runtime_macro_context ) # pyright: ignore[reportArgumentType]
293294
295+ _ = self ._adapter .connections .set_connection_name ()
296+ _ = atexit .register (self ._adapter .connections .cleanup_all )
297+
294298 def parse_project (self , write_manifest : bool = True ) -> None :
295299 """Parse the dbt project and load manifest."""
296300 self ._initialize_adapter (replace = False )
@@ -379,6 +383,8 @@ def execute_sql(self, sql: str, compile: bool = True) -> ExecutionResult:
379383 compiled_code = compiled_code ,
380384 )
381385
386+ query = execute_sql
387+
382388 def compile_sql (self , sql : str ) -> CompilationResult :
383389 """Compile SQL without execution.
384390
0 commit comments