summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sqlalchemy/orm/util.py2
-rw-r--r--lib/sqlalchemy/testing/pickleable.py10
-rw-r--r--test/orm/test_pickled.py19
3 files changed, 24 insertions, 7 deletions
diff --git a/lib/sqlalchemy/orm/util.py b/lib/sqlalchemy/orm/util.py
index 14a6bccb0..0d4d4a837 100644
--- a/lib/sqlalchemy/orm/util.py
+++ b/lib/sqlalchemy/orm/util.py
@@ -1256,7 +1256,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 c14c681f6..4206e3041 100644
--- a/lib/sqlalchemy/testing/pickleable.py
+++ b/lib/sqlalchemy/testing/pickleable.py
@@ -14,6 +14,8 @@ unpickling.
from __future__ import annotations
from . import fixtures
+from ..schema import Column
+from ..types import String
class User(fixtures.ComparableEntity):
@@ -55,6 +57,14 @@ class Screen:
self.parent = parent
+class Mixin:
+ email_address = Column(String)
+
+
+class AddressWMixin(Mixin, fixtures.ComparableEntity):
+ pass
+
+
class Foo:
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 fa3fbfa2c..a0706a133 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
@@ -328,23 +330,27 @@ class PickleTest(fixtures.MappedTest):
eq_(len(u2.addresses), 2)
@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()
@@ -353,8 +359,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()