--- /dev/null
+.. change::
+ :tags: bug, orm, regression
+ :tickets: 6558
+
+ Fixed regression caused by just-released performance fix mentioned in #6550
+ where a query.join() to a relationship could produce an AttributeError if
+ the query were made against non-ORM structures only, a fairly unusual
+ calling pattern.
compatible with QueryableAttribute."""
return inspect(self._parententity).mapper
+ @property
+ def _propagate_attrs(self):
+ # this suits the case in coercions where we don't actually
+ # call ``__clause_element__()`` but still need to get
+ # resolved._propagate_attrs. See #6558.
+ return util.immutabledict(
+ {
+ "compile_state_plugin": "orm",
+ "plugin_subject": self._parentmapper,
+ }
+ )
+
@property
def adapter(self):
"""Produce a callable that adapts column expressions
self, original_element, resolved, argname=None, legacy=False, **kw
):
if isinstance(original_element, roles.JoinTargetRole):
+ # note that this codepath no longer occurs as of
+ # #6550, unless JoinTargetImpl._skip_clauseelement_for_target_match
+ # were set to False.
return original_element
elif legacy and isinstance(resolved, str):
util.warn_deprecated_20(
},
"e1",
),
+ (
+ lambda users, User: {"clause": select(users).join(User.addresses)},
+ "e1",
+ ),
(lambda Address: {"mapper": Address}, "e2"),
(lambda Address: {"clause": Query([Address])._statement_20()}, "e2"),
(lambda addresses: {"clause": select(addresses)}, "e2"),
e2=e2,
e3=e3,
addresses=addresses,
+ users=users,
)
sess = Session(e3)
from sqlalchemy import exc as sa_exc
from sqlalchemy import ForeignKey
from sqlalchemy import func
+from sqlalchemy import inspect
from sqlalchemy import Integer
from sqlalchemy import lateral
from sqlalchemy import literal_column
"WHERE users.name = :name_1",
)
+ def test_join_relationship_propagate_attrs(self):
+ """test #6558"""
+
+ User = self.classes.User
+ users = self.tables.users
+
+ stmt = select(users).join(User.addresses)
+
+ eq_(
+ stmt._propagate_attrs,
+ {"compile_state_plugin": "orm", "plugin_subject": inspect(User)},
+ )
+
+ self.assert_compile(
+ stmt,
+ "SELECT users.id, users.name FROM users "
+ "JOIN addresses ON users.id = addresses.user_id",
+ )
+
def test_invalid_kwarg_join(self):
User = self.classes.User
sess = fixture_session()