summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES2
-rw-r--r--lib/sqlalchemy/orm/strategies.py4
-rw-r--r--test/orm/mapper.py31
3 files changed, 36 insertions, 1 deletions
diff --git a/CHANGES b/CHANGES
index 0bba9d188..38474189e 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 d8d9a9c47..50a2ea27d 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 0ad00f8ad..479d48453 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)