--- /dev/null
+.. change::
+ :tags: bug, orm
+ :tickets: 4997
+
+ Fixed issue involving ``lazy="raise"`` strategy where an ORM delete of an
+ object would raise for a simple "use-get" style many-to-one relationship
+ that had lazy="raise" configured. This is inconsistent vs. the change
+ introduced in 1.3 as part of :ticket:`4353`, where it was established that
+ a history operation that does not expect emit SQL should bypass the
+ ``lazy="raise"`` check, and instead effectively treat it as
+ ``lazy="raise_on_sql"`` for this case. The fix adjusts the lazy loader
+ strategy to not raise for the case where the lazy load was instructed that
+ it should not emit SQL if the object were not present.
self.is_aliased_class = inspect(self.entity).is_aliased_class
join_condition = self.parent_property._join_condition
- self._lazywhere, self._bind_to_col, self._equated_columns = (
- join_condition.create_lazy_clause()
- )
+ (
+ self._lazywhere,
+ self._bind_to_col,
+ self._equated_columns,
+ ) = join_condition.create_lazy_clause()
(
self._rev_lazywhere,
):
return attributes.PASSIVE_NO_RESULT
- if self._raise_always and not passive & attributes.NO_RAISE:
+ if (
+ # we were given lazy="raise"
+ self._raise_always
+ # the no_raise history-related flag was not passed
+ and not passive & attributes.NO_RAISE
+ and (
+ # if we are use_get and related_object_ok is disabled,
+ # which means we are at most looking in the identity map
+ # for history purposes or otherwise returning
+ # PASSIVE_NO_RESULT, don't raise. This is also a
+ # history-related flag
+ not self.use_get
+ or passive & attributes.RELATED_OBJECT_OK
+ )
+ ):
+
self._invoke_raise_load(state, passive, "raise")
session = _state_session(state)
s.commit()
+ eq_(s.query(Address).count(), 1)
+ eq_(s.query(User).count(), 1)
+
+ # test for issue #4997
+ # delete of Address should proceed, as User object does not
+ # need to be loaded
+ s.delete(a1)
+ s.commit()
+ eq_(s.query(Address).count(), 0)
+ eq_(s.query(User).count(), 1)
+
class RelationDeprecationTest(fixtures.MappedTest):