From: Mike Bayer Date: Wed, 18 Aug 2010 14:54:40 +0000 (-0400) Subject: - object_session() raises the proper X-Git-Tag: rel_0_6_4~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=61562e58435efddda19d15c61afd6e5326745a31;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - object_session() raises the proper UnmappedInstanceError when presented with an unmapped instance. [ticket:1881] --- diff --git a/CHANGES b/CHANGES index 4f60857ef8..aae1139a14 100644 --- a/CHANGES +++ b/CHANGES @@ -100,6 +100,10 @@ CHANGES in some UNION situations, would fail to propagate the inner columns completely to the outer query. [ticket:1852] + + - object_session() raises the proper + UnmappedInstanceError when presented with an + unmapped instance. [ticket:1881] - sql - Added basic math expression coercion for diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index c67dc5553f..86d5dd7730 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -1674,9 +1674,17 @@ def make_transient(instance): def object_session(instance): - """Return the ``Session`` to which instance belongs, or None.""" + """Return the ``Session`` to which instance belongs. + + If the instance is not a mapped instance, an error is raised. - return _state_session(attributes.instance_state(instance)) + """ + + try: + return _state_session(attributes.instance_state(instance)) + except exc.NO_STATE: + raise exc.UnmappedInstanceError(instance) + def _state_session(state): if state.session_id: diff --git a/test/orm/test_session.py b/test/orm/test_session.py index 22de94e2b3..779db304e2 100644 --- a/test/orm/test_session.py +++ b/test/orm/test_session.py @@ -10,7 +10,8 @@ import sqlalchemy as sa from sqlalchemy.test import engines, testing, config from sqlalchemy import Integer, String, Sequence from sqlalchemy.test.schema import Table, Column -from sqlalchemy.orm import mapper, relationship, backref, joinedload +from sqlalchemy.orm import mapper, relationship, backref, joinedload, \ + exc as orm_exc, object_session from sqlalchemy.test.testing import eq_ from test.engine import _base as engine_base from test.orm import _base, _fixtures @@ -67,6 +68,20 @@ class SessionTest(_fixtures.FixtureTest): finally: c.close() + @testing.resolve_artifact_names + def test_object_session_raises(self): + assert_raises( + orm_exc.UnmappedInstanceError, + object_session, + object() + ) + + assert_raises( + orm_exc.UnmappedInstanceError, + object_session, + User() + ) + @testing.requires.sequences def test_sequence_execute(self): seq = Sequence("some_sequence")