Skip to content

Commit f76ebe3

Browse files
committed
fix: Safely retrieve __tablename__ for cache invalidation, preventing errors when the attribute is missing.
1 parent 460e3d7 commit f76ebe3

2 files changed

Lines changed: 10 additions & 4 deletions

File tree

advanced_alchemy/repository/_async.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -713,10 +713,13 @@ def _queue_cache_invalidation(self, entity_id: Any, bind_group: Optional[str] =
713713
if self._cache_manager is not None:
714714
from advanced_alchemy._listeners import get_cache_tracker
715715

716-
model_name = cast("str", self.model_type.__tablename__) # type: ignore[attr-defined]
716+
# Check if model_type has __tablename__ (may not exist in mock scenarios)
717+
model_name = getattr(self.model_type, "__tablename__", None)
718+
if model_name is None:
719+
return
717720
tracker = get_cache_tracker(self.session, self._cache_manager)
718721
if tracker is not None:
719-
tracker.add_invalidation(model_name, entity_id, bind_group)
722+
tracker.add_invalidation(cast("str", model_name), entity_id, bind_group)
720723

721724
def _type_must_use_in_instead_of_any(self, matched_values: "list[Any]", field_type: "Any" = None) -> bool:
722725
"""Determine if field.in_() should be used instead of any_() for compatibility.

advanced_alchemy/repository/_sync.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -714,10 +714,13 @@ def _queue_cache_invalidation(self, entity_id: Any, bind_group: Optional[str] =
714714
if self._cache_manager is not None:
715715
from advanced_alchemy._listeners import get_cache_tracker
716716

717-
model_name = cast("str", self.model_type.__tablename__) # type: ignore[attr-defined]
717+
# Check if model_type has __tablename__ (may not exist in mock scenarios)
718+
model_name = getattr(self.model_type, "__tablename__", None)
719+
if model_name is None:
720+
return
718721
tracker = get_cache_tracker(self.session, self._cache_manager)
719722
if tracker is not None:
720-
tracker.add_invalidation(model_name, entity_id, bind_group)
723+
tracker.add_invalidation(cast("str", model_name), entity_id, bind_group)
721724

722725
def _type_must_use_in_instead_of_any(self, matched_values: "list[Any]", field_type: "Any" = None) -> bool:
723726
"""Determine if field.in_() should be used instead of any_() for compatibility.

0 commit comments

Comments
 (0)