--- /dev/null
+.. change::
+ :tags: bug, orm
+ :tickets: 8853
+
+ Fixed regression in 2.0.0b3 caused by :ticket:`8759` where indicating the
+ :class:`.Mapped` name using a qualified name such as
+ ``sqlalchemy.orm.Mapped`` would fail to be recognized by Declarative as
+ indicating the :class:`.Mapped` construct.
def eval_name_only(name: str, module_name: str) -> Any:
+ if "." in name:
+ return eval_expression(name, module_name)
try:
base_globals: Dict[str, Any] = sys.modules[module_name].__dict__
from sqlalchemy import Table
from sqlalchemy import testing
from sqlalchemy import Uuid
+import sqlalchemy.orm
from sqlalchemy.orm import attribute_keyed_dict
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import DynamicMapped
class MappedColumnTest(_MappedColumnTest):
+ def test_fully_qualified_mapped_name(self, decl_base):
+ """test #8853, regression caused by #8759 ;)""" # noqa: E501
+
+ class Foo(decl_base):
+ __tablename__ = "foo"
+
+ id: sqlalchemy.orm.Mapped[int] = mapped_column(primary_key=True)
+
+ data: sqlalchemy.orm.Mapped[int] = mapped_column()
+
+ data2: sqlalchemy.orm.Mapped[int]
+
+ self.assert_compile(
+ select(Foo), "SELECT foo.id, foo.data, foo.data2 FROM foo"
+ )
+
def test_indirect_mapped_name_module_level(self, decl_base):
"""test #8759