From 8d7833d27c2f529ae65e84a5932e47457b989871 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 30 Jan 2007 22:04:53 +0000 Subject: [PATCH] - fix to deferred so that load operation doesnt mistakenly occur when only PK col attributes are set --- CHANGES | 2 ++ lib/sqlalchemy/orm/strategies.py | 4 ++++ test/orm/mapper.py | 31 ++++++++++++++++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 0bba9d1884..38474189e3 100644 --- a/CHANGES +++ b/CHANGES @@ -17,6 +17,8 @@ relationships, specifically between polymorphic mappers. - fixed bug where cascade operations incorrectly included deleted collection items in the cascade [ticket:445] + - fix to deferred so that load operation doesnt mistakenly occur when only + PK col attributes are set - oracle: - when returning "rowid" as the ORDER BY column or in use with ROW_NUMBER OVER, oracle dialect checks the selectable its being applied to and will switch to diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index d8d9a9c470..50a2ea27d2 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -73,6 +73,10 @@ class DeferredColumnLoader(LoaderStrategy): def lazyload(): if self._should_log_debug: self.logger.debug("deferred load %s group %s" % (mapperutil.attribute_str(instance, self.key), str(self.group))) + + if not mapper.has_identity(instance): + return None + try: pk = self.parent.pks_by_table[self.columns[0].table] except KeyError: diff --git a/test/orm/mapper.py b/test/orm/mapper.py index 0ad00f8ad4..479d484539 100644 --- a/test/orm/mapper.py +++ b/test/orm/mapper.py @@ -659,7 +659,36 @@ class DeferredTest(MapperSuperTest): ("SELECT orders.order_id AS orders_order_id, orders.user_id AS orders_user_id, orders.isopen AS orders_isopen FROM orders ORDER BY %s" % orderby, {}), ("SELECT orders.description AS orders_description FROM orders WHERE orders.order_id = :orders_order_id", {'orders_order_id':3}) ]) - + + def testunsaved(self): + """test that deferred loading doesnt kick in when just PK cols are set""" + m = mapper(Order, orders, properties={ + 'description':deferred(orders.c.description) + }) + + sess = create_session() + o = Order() + sess.save(o) + o.order_id = 7 + def go(): + o.description = "some description" + self.assert_sql_count(testbase.db, go, 0) + + def testunsavedgroup(self): + """test that deferred loading doesnt kick in when just PK cols are set""" + m = mapper(Order, orders, properties={ + 'description':deferred(orders.c.description, group='primary'), + 'opened':deferred(orders.c.isopen, group='primary') + }) + + sess = create_session() + o = Order() + sess.save(o) + o.order_id = 7 + def go(): + o.description = "some description" + self.assert_sql_count(testbase.db, go, 0) + def testsave(self): m = mapper(Order, orders, properties={ 'description':deferred(orders.c.description) -- 2.47.2