From: Mike Bayer Date: Sun, 29 Mar 2009 21:21:10 +0000 (+0000) Subject: - Lazy loader will not use get() if the "lazy load" X-Git-Tag: rel_0_5_4~44 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d0f67e2c4de4b688409c2589018fdfdba65e837f;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Lazy loader will not use get() if the "lazy load" SQL clause matches the clause used by get(), but contains some parameters hardcoded. Previously the lazy strategy would fail with the get(). Ideally get() would be used with the hardcoded parameters but this would require further development. [ticket:1357] --- diff --git a/CHANGES b/CHANGES index b6d9dae3e5..8aa1709c6e 100644 --- a/CHANGES +++ b/CHANGES @@ -13,6 +13,14 @@ CHANGES Set collection is now compatible with merge(), fixes [ticket:1352]. + - Lazy loader will not use get() if the "lazy load" + SQL clause matches the clause used by get(), but + contains some parameters hardcoded. Previously + the lazy strategy would fail with the get(). Ideally + get() would be used with the hardcoded parameters + but this would require further development. + [ticket:1357] + - sql - Fixed __repr__() and other _get_colspec() methods on ForeignKey constructed from __clause_element__() style diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index f94e849e56..5a0d5b0430 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -2013,7 +2013,7 @@ class _BindParamClause(ColumnElement): the same type. """ - return isinstance(other, _BindParamClause) and other.type.__class__ == self.type.__class__ + return isinstance(other, _BindParamClause) and other.type.__class__ == self.type.__class__ and self.value == other.value def __getstate__(self): """execute a deferred value for serialization purposes.""" diff --git a/test/orm/lazy_relations.py b/test/orm/lazy_relations.py index 4ac8a13efc..b5c3b3669e 100644 --- a/test/orm/lazy_relations.py +++ b/test/orm/lazy_relations.py @@ -173,6 +173,27 @@ class LazyTest(_fixtures.FixtureTest): l = q.filter(users.c.id == 7).all() assert [User(id=7, address=Address(id=1))] == l + @testing.resolve_artifact_names + def test_many_to_one_binds(self): + mapper(Address, addresses, primary_key=[addresses.c.user_id, addresses.c.email_address]) + + mapper(User, users, properties = dict( + address = relation(Address, uselist=False, + primaryjoin=sa.and_(users.c.id==addresses.c.user_id, addresses.c.email_address=='ed@bettyboop.com') + ) + )) + q = create_session().query(User) + eq_( + [ + User(id=7, address=None), + User(id=8, address=Address(id=3)), + User(id=9, address=None), + User(id=10, address=None), + ], + list(q) + ) + + @testing.resolve_artifact_names def test_double(self): """tests lazy loading with two relations simulatneously, from the same table, using aliases. """ diff --git a/test/sql/select.py b/test/sql/select.py index 5d6d6dcaab..15c47a6747 100644 --- a/test/sql/select.py +++ b/test/sql/select.py @@ -404,6 +404,7 @@ sq.myothertable_othername AS sq_myothertable_othername FROM (" + sqstring + ") A "myothertable.othername = :othername_2 OR myothertable.otherid = :otherid_1) AND sysdate() = today()", checkparams = {'othername_1': 'asdf', 'othername_2':'foo', 'otherid_1': 9, 'myid_1': 12} ) + def test_distinct(self): self.assert_compile(