- changed status to resolved
cache key error w/ undefer group on top of defaultload, 1.2 regression w/ lazyload caching
Issue #4049
resolved
related to #4048, we can't even get to the lazyload for this one
def test_undefer_group_from_relationship_lazyload(self):
users, Order, User, orders = \
(self.tables.users,
self.classes.Order,
self.classes.User,
self.tables.orders)
mapper(User, users, properties=dict(
orders=relationship(Order, order_by=orders.c.id)))
mapper(
Order, orders, properties=util.OrderedDict([
('userident', deferred(orders.c.user_id, group='primary')),
('description', deferred(orders.c.description,
group='primary')),
('opened', deferred(orders.c.isopen, group='primary'))
])
)
sess = create_session()
q = sess.query(User).filter(User.id == 7).options(
defaultload(User.orders).undefer_group('primary')
)
def go():
result = q.all()
o2 = result[0].orders[1]
eq_(o2.opened, 1)
eq_(o2.userident, 7)
eq_(o2.description, 'order 3')
self.assert_sql_count(testing.db, go, 1)
trace:
#!
Traceback (most recent call last):
File "/home/classic/dev/sqlalchemy/test/orm/test_deferred.py", line 419, in test_undefer_group_from_relationship_lazyload
self.assert_sql_count(testing.db, go, 1)
File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/testing/assertions.py", line 520, in assert_sql_count
db, callable_, assertsql.CountStatements(count))
File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/testing/assertions.py", line 500, in assert_sql_execution
result = callable_()
File "/home/classic/dev/sqlalchemy/test/orm/test_deferred.py", line 415, in go
o2 = result[0].orders[1]
File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/attributes.py", line 242, in __get__
return self.impl.get(instance_state(instance), dict_)
File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/attributes.py", line 603, in get
value = self.callable_(state, passive)
File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/strategies.py", line 623, in _load_for_state
return self._emit_lazyload(session, state, ident_key, passive)
File "<string>", line 1, in <lambda>
File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/strategies.py", line 714, in _emit_lazyload
state.load_options, effective_path
File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/ext/baked.py", line 178, in _add_lazyload_options
cache_key = opt._generate_cache_key(cache_path)
File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/strategy_options.py", line 389, in _generate_cache_key
c_key = opt._generate_cache_key(path)
File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/strategy_options.py", line 113, in _generate_cache_key
obj.strategy +
TypeError: can only concatenate tuple (not "NoneType") to tuple
Comments (1)
-
reporter - Log in to comment
Handle cache key for option that has no strategy
Fixed regression where the use of a :func:
.undefer_group
option in conjunction with a lazy loaded relationship option would cause an attribute error, due to a bug in the SQL cache key generation added in 1.2 as part of3954
.Change-Id: Icd9a34f0b5aa96d6433a2ab9c8d3eaee0006f609 Fixes:
#4049→ <<cset 3f9df2b86b4a>>