From 61562e58435efddda19d15c61afd6e5326745a31 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 18 Aug 2010 10:54:40 -0400 Subject: [PATCH] - object_session() raises the proper UnmappedInstanceError when presented with an unmapped instance. [ticket:1881] --- CHANGES | 4 ++++ lib/sqlalchemy/orm/session.py | 12 ++++++++++-- test/orm/test_session.py | 17 ++++++++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) 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") -- 2.47.2