diff options
author | Adrian Moennich <adrian@planetcoding.net> | 2015-08-11 23:08:28 +0200 |
---|---|---|
committer | Adrian Moennich <adrian@planetcoding.net> | 2015-08-12 18:39:43 +0200 |
commit | 6d334da16553c91cbe82de7134042dbe3c511630 (patch) | |
tree | db66cc1463a64ec7cb2d9f986521d3d567e659da /test/orm/test_mapper.py | |
parent | 5198b1de31029cc985102cd13569086a7056c2f1 (diff) | |
download | sqlalchemy-pr/193.tar.gz |
Add raise/raiseload relationship loading strategypr/193
- available via `lazy='raise'` or by setting the `raiseload` strategy
via `options()`
- behaves almost like `lazy='noload'`, but instead of returning `None`
it raises `InvalidRequestError`
- based on code from Mike Bayer that was posted to the sqlalchemy
mailing list: https://groups.google.com/forum/#!topic/sqlalchemy/X_wA8K97smE
Diffstat (limited to 'test/orm/test_mapper.py')
-rw-r--r-- | test/orm/test_mapper.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/test/orm/test_mapper.py b/test/orm/test_mapper.py index 6845ababb..237371dc7 100644 --- a/test/orm/test_mapper.py +++ b/test/orm/test_mapper.py @@ -2717,6 +2717,85 @@ class NoLoadTest(_fixtures.FixtureTest): self.sql_count_(0, go) +class RaiseLoadTest(_fixtures.FixtureTest): + run_inserts = 'once' + run_deletes = None + + def test_o2m_raiseload(self): + Address, addresses, users, User = ( + self.classes.Address, + self.tables.addresses, + self.tables.users, + self.classes.User) + + m = mapper(User, users, properties=dict( + addresses=relationship(mapper(Address, addresses), lazy='raise') + )) + q = create_session().query(m) + l = [None] + + def go(): + x = q.filter(User.id == 7).all() + assert_raises_message( + sa.exc.InvalidRequestError, + "'User.addresses' is not available due to lazy='raise'", + lambda: x[0].addresses) + l[0] = x + print(x) + self.assert_sql_count(testing.db, go, 1) + + self.assert_result( + l[0], User, + {'id': 7}, + ) + + def test_upgrade_o2m_raiseload_lazyload_option(self): + Address, addresses, users, User = ( + self.classes.Address, + self.tables.addresses, + self.tables.users, + self.classes.User) + + m = mapper(User, users, properties=dict( + addresses=relationship(mapper(Address, addresses), lazy='raise') + )) + q = create_session().query(m).options(sa.orm.lazyload('addresses')) + l = [None] + + def go(): + x = q.filter(User.id == 7).all() + x[0].addresses + l[0] = x + self.sql_count_(2, go) + + self.assert_result( + l[0], User, + {'id': 7, 'addresses': (Address, [{'id': 1}])}, + ) + + def test_m2o_raiseload_option(self): + Address, addresses, users, User = ( + self.classes.Address, + self.tables.addresses, + self.tables.users, + self.classes.User) + mapper(Address, addresses, properties={ + 'user': relationship(User) + }) + mapper(User, users) + s = Session() + a1 = s.query(Address).filter_by(id=1).options( + sa.orm.raiseload('user')).first() + + def go(): + assert_raises_message( + sa.exc.InvalidRequestError, + "'Address.user' is not available due to lazy='raise'", + lambda: a1.user) + + self.sql_count_(0, go) + + class RequirementsTest(fixtures.MappedTest): """Tests the contract for user classes.""" |