@@ -51,6 +51,10 @@ def __init__(
5151 )
5252 self .raise_on_failure = raise_on_failure
5353 self .env_vars = env_vars
54+
55+ # Apply databricks compatibility patch for version 1.10.2
56+ self ._apply_databricks_compatibility_patch ()
57+
5458 if force_dbt_deps :
5559 self .deps ()
5660 elif run_deps_if_needed :
@@ -318,3 +322,104 @@ def _run_deps_if_needed(self):
318322
319323 if should_run_deps :
320324 self .deps ()
325+
326+ def _apply_databricks_compatibility_patch (self ):
327+ """Apply monkey patch to fix dbt-databricks 1.10.2 compatibility issues"""
328+ try :
329+ from dbt .adapters .databricks import parse_model
330+ import logging
331+
332+ # Define safe wrapper functions
333+ def is_unsupported_object (model ):
334+ """Check if the object is a Macro or other unsupported type"""
335+ return hasattr (model , '__class__' ) and 'Macro' in str (model .__class__ )
336+
337+ def safe_catalog_name (model ):
338+ try :
339+ if is_unsupported_object (model ):
340+ logger .debug (f"Received unsupported object type for catalog_name, using unity as default" )
341+ return 'unity'
342+ # Handle RelationConfig objects
343+ if hasattr (model , 'config' ) and model .config and hasattr (model .config , 'get' ):
344+ catalog = model .config .get ('catalog' )
345+ if catalog :
346+ return catalog
347+ # Fallback to unity catalog
348+ return 'unity'
349+ except Exception as e :
350+ logger .debug (f"Failed to parse catalog name from model: { e } . Using unity as default." )
351+ return 'unity'
352+
353+ def safe_file_format (model ):
354+ try :
355+ if is_unsupported_object (model ):
356+ return None
357+ return safe_get (model , 'file_format' )
358+ except Exception as e :
359+ logger .debug (f"Failed to get file_format from model: { e } " )
360+ return None
361+
362+ def safe_location_path (model ):
363+ try :
364+ if is_unsupported_object (model ):
365+ return None
366+ if not hasattr (model , 'config' ) or not model .config :
367+ return None
368+ if model .config .get ('include_full_name_in_path' ):
369+ return f"{ model .database } /{ model .schema } /{ model .identifier } "
370+ return model .identifier if hasattr (model , 'identifier' ) else None
371+ except Exception as e :
372+ logger .debug (f"Failed to get location_path from model: { e } " )
373+ return None
374+
375+ def safe_location_root (model ):
376+ try :
377+ if is_unsupported_object (model ):
378+ return None
379+ return safe_get (model , 'location_root' )
380+ except Exception as e :
381+ logger .debug (f"Failed to get location_root from model: { e } " )
382+ return None
383+
384+ def safe_table_format (model ):
385+ try :
386+ if is_unsupported_object (model ):
387+ return None
388+ return safe_get (model , 'table_format' )
389+ except Exception as e :
390+ logger .debug (f"Failed to get table_format from model: { e } " )
391+ return None
392+
393+ def safe_get (model , setting : str , case_sensitive = False ):
394+ try :
395+ if is_unsupported_object (model ):
396+ return None
397+ # Check if model has config attribute
398+ if not hasattr (model , 'config' ) or not model .config :
399+ return None
400+ # Check if config has get method
401+ if not hasattr (model .config , 'get' ):
402+ return None
403+ value = model .config .get (setting )
404+ if value :
405+ return value if case_sensitive else value .lower ()
406+ return None
407+ except Exception as e :
408+ logger .debug (f"Failed to get { setting } from model config: { e } " )
409+ return None
410+
411+ # Replace problematic functions with safe versions
412+ parse_model .catalog_name = safe_catalog_name
413+ parse_model .file_format = safe_file_format
414+ parse_model .location_path = safe_location_path
415+ parse_model .location_root = safe_location_root
416+ parse_model .table_format = safe_table_format
417+ parse_model ._get = safe_get
418+
419+ logger .debug ("Applied dbt-databricks 1.10.2 compatibility patch" )
420+
421+ except ImportError :
422+ # parse_model module doesn't exist in older versions
423+ pass
424+ except Exception as e :
425+ logger .debug (f"Failed to apply dbt-databricks compatibility patch: { e } " )
0 commit comments