From 4f59ecef6f500e7e2586ee9c5d992a33e0d5d043 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 9 Jun 2022 08:55:14 -0400 Subject: [PATCH] handle non-mapped mixins for with_loader_criteria reduce special handling is needed for a with_loader_criteria() against a non-mapped mixin class. added that to test coverage Fixes: #8109 Change-Id: Ia599361c8faab008e92095eb4607d02820f590d5 (cherry picked from commit 6f93f88b5ee683141c81ecd434a4c0818e08dbd9) --- lib/sqlalchemy/orm/util.py | 2 +- lib/sqlalchemy/testing/pickleable.py | 10 ++++++++++ test/orm/test_pickled.py | 19 +++++++++++++------ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/lib/sqlalchemy/orm/util.py b/lib/sqlalchemy/orm/util.py index 66f42ba810..f95af41d24 100644 --- a/lib/sqlalchemy/orm/util.py +++ b/lib/sqlalchemy/orm/util.py @@ -1174,7 +1174,7 @@ class LoaderCriteriaOption(CriteriaOption): return ( LoaderCriteriaOption._unreduce, ( - self.entity.class_ if self.entity else None, + self.entity.class_ if self.entity else self.root_entity, self._where_crit_orig, self.include_aliases, self.propagate_to_loaders, diff --git a/lib/sqlalchemy/testing/pickleable.py b/lib/sqlalchemy/testing/pickleable.py index 04405e5397..f05960c839 100644 --- a/lib/sqlalchemy/testing/pickleable.py +++ b/lib/sqlalchemy/testing/pickleable.py @@ -10,6 +10,8 @@ unpickling. """ from . import fixtures +from ..schema import Column +from ..types import String class User(fixtures.ComparableEntity): @@ -51,6 +53,14 @@ class Screen(object): self.parent = parent +class Mixin(object): + email_address = Column(String) + + +class AddressWMixin(Mixin, fixtures.ComparableEntity): + pass + + class Foo(object): def __init__(self, moredata, stuff="im stuff"): self.data = "im data" diff --git a/test/orm/test_pickled.py b/test/orm/test_pickled.py index c1be0ca25c..fe7ac7b702 100644 --- a/test/orm/test_pickled.py +++ b/test/orm/test_pickled.py @@ -24,10 +24,12 @@ from sqlalchemy.testing import eq_ from sqlalchemy.testing import fixtures from sqlalchemy.testing.fixtures import fixture_session from sqlalchemy.testing.pickleable import Address +from sqlalchemy.testing.pickleable import AddressWMixin from sqlalchemy.testing.pickleable import Child1 from sqlalchemy.testing.pickleable import Child2 from sqlalchemy.testing.pickleable import Dingaling from sqlalchemy.testing.pickleable import EmailUser +from sqlalchemy.testing.pickleable import Mixin from sqlalchemy.testing.pickleable import Order from sqlalchemy.testing.pickleable import Parent from sqlalchemy.testing.pickleable import Screen @@ -331,23 +333,27 @@ class PickleTest(fixtures.MappedTest): @testing.requires.python3 @testing.combinations(True, False, argnames="pickle_it") - def test_loader_criteria(self, pickle_it): + @testing.combinations(True, False, argnames="use_mixin") + def test_loader_criteria(self, pickle_it, use_mixin): """test #8109""" users, addresses = (self.tables.users, self.tables.addresses) + AddressCls = AddressWMixin if use_mixin else Address + self.mapper_registry.map_imperatively( User, users, - properties={"addresses": relationship(Address)}, + properties={"addresses": relationship(AddressCls)}, ) - self.mapper_registry.map_imperatively(Address, addresses) + + self.mapper_registry.map_imperatively(AddressCls, addresses) with fixture_session(expire_on_commit=False) as sess: u1 = User(name="ed") u1.addresses = [ - Address(email_address="ed@bar.com"), - Address(email_address="ed@foo.com"), + AddressCls(email_address="ed@bar.com"), + AddressCls(email_address="ed@foo.com"), ] sess.add(u1) sess.commit() @@ -356,8 +362,9 @@ class PickleTest(fixtures.MappedTest): # note that non-lambda is not picklable right now as # SQL expressions usually can't be pickled. opt = with_loader_criteria( - Address, + Mixin if use_mixin else Address, no_ed_foo, + include_aliases=True, ) u1 = sess.query(User).options(opt).first() -- 2.47.2