diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2011-07-31 17:32:07 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2011-07-31 17:32:07 -0400 |
| commit | 1a0c8ace3010d9d7bcfd651d4bb1340b83b3850b (patch) | |
| tree | 8a7d6dd2ee174c7893e77e7be2d4764ba816c57e /lib/sqlalchemy | |
| parent | f948fa0fb0c73d01077d65b1b8103c12282ff020 (diff) | |
| download | sqlalchemy-1a0c8ace3010d9d7bcfd651d4bb1340b83b3850b.tar.gz | |
- Load of a deferred() attribute on an object
where row can't be located raises
ObjectDeletedError instead of failing later
on; improved the message in ObjectDeletedError
to include other conditions besides a simple
"delete". [ticket:2191]
- break up test_get_refreshes() in test_expire
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/exc.py | 9 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/mapper.py | 4 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/strategies.py | 6 |
3 files changed, 12 insertions, 7 deletions
diff --git a/lib/sqlalchemy/orm/exc.py b/lib/sqlalchemy/orm/exc.py index 1812f0d72..98b97059e 100644 --- a/lib/sqlalchemy/orm/exc.py +++ b/lib/sqlalchemy/orm/exc.py @@ -7,7 +7,7 @@ """SQLAlchemy ORM exceptions.""" import sqlalchemy as sa - +orm_util = sa.util.importlater('sqlalchemy.orm', 'util') NO_STATE = (AttributeError, KeyError) """Exception types that may be raised by instrumentation implementations.""" @@ -95,7 +95,12 @@ class ObjectDeletedError(sa.exc.InvalidRequestError): object. """ - + def __init__(self, state): + sa.exc.InvalidRequestError.__init__( + self, + "Instance '%s' has been deleted, or its " + "row is otherwise not present." % orm_util.state_str(state) + ) class UnmappedColumnError(sa.exc.InvalidRequestError): """Mapping operation was requested on an unknown column.""" diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 3c3389d79..becc47052 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -1586,9 +1586,7 @@ class Mapper(object): # if instance is pending, a refresh operation # may not complete (even if PK attributes are assigned) if has_key and result is None: - raise orm_exc.ObjectDeletedError( - "Instance '%s' has been deleted." % - state_str(state)) + raise orm_exc.ObjectDeletedError(state) def _optimized_get_statement(self, state, attribute_names): """assemble a WHERE clause which retrieves a given state by primary diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index aacf466d6..c335d1509 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -242,8 +242,10 @@ class DeferredColumnLoader(LoaderStrategy): ) query = session.query(localparent) - query._load_on_ident(state.key, - only_load_props=group, refresh_state=state) + if query._load_on_ident(state.key, + only_load_props=group, refresh_state=state) is None: + raise orm_exc.ObjectDeletedError(state) + return attributes.ATTR_WAS_SET log.class_logger(DeferredColumnLoader) |
