summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sqlalchemy/ext/hybrid.py2
-rw-r--r--lib/sqlalchemy/orm/attributes.py16
2 files changed, 10 insertions, 8 deletions
diff --git a/lib/sqlalchemy/ext/hybrid.py b/lib/sqlalchemy/ext/hybrid.py
index de9ab52be..a5dc31583 100644
--- a/lib/sqlalchemy/ext/hybrid.py
+++ b/lib/sqlalchemy/ext/hybrid.py
@@ -1122,7 +1122,7 @@ class hybrid_property(interfaces.InspectionAttrInfo, ORMDescriptor[_T]):
name = self.__name__
break
else:
- name = attributes.NO_KEY
+ name = attributes._UNKNOWN_ATTR_KEY # type: ignore[assignment]
return proxy_attr(
owner,
diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py
index 5e6852cbf..65d6970a9 100644
--- a/lib/sqlalchemy/orm/attributes.py
+++ b/lib/sqlalchemy/orm/attributes.py
@@ -55,6 +55,7 @@ from .base import Mapped as Mapped # noqa
from .base import NEVER_SET # noqa
from .base import NO_AUTOFLUSH
from .base import NO_CHANGE # noqa
+from .base import NO_KEY
from .base import NO_RAISE
from .base import NO_VALUE
from .base import NON_PERSISTENT_OK # noqa
@@ -115,20 +116,16 @@ if TYPE_CHECKING:
_T = TypeVar("_T")
-class NoKey(str):
- pass
-
-
_AllPendingType = Sequence[
Tuple[Optional["InstanceState[Any]"], Optional[object]]
]
-NO_KEY = NoKey("no name")
-
SelfQueryableAttribute = TypeVar(
"SelfQueryableAttribute", bound="QueryableAttribute[Any]"
)
+_UNKNOWN_ATTR_KEY = object()
+
@inspection._self_inspects
class QueryableAttribute(
@@ -327,7 +324,12 @@ class QueryableAttribute(
def _memoized_attr_expression(self) -> ColumnElement[_T]:
annotations: _AnnotationDict
- if self.key is NO_KEY:
+ # applies only to Proxy() as used by hybrid.
+ # currently is an exception to typing rather than feeding through
+ # non-string keys.
+ # ideally Proxy() would have a separate set of methods to deal
+ # with this case.
+ if self.key is _UNKNOWN_ATTR_KEY: # type: ignore[comparison-overlap]
annotations = {"entity_namespace": self._entity_namespace}
else:
annotations = {