Skip to content

Commit 62d7976

Browse files
committed
Add Databricks 1.10.2 compatibility patch
1 parent 66406b0 commit 62d7976

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

elementary/clients/dbt/command_line_dbt_runner.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)