diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-06-03 14:33:08 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-06-03 14:33:08 +0000 |
commit | cde133c45d01848cd5696113fe94f269b7fe8d9c (patch) | |
tree | 8f03c243549f33daff3062ec38c2fcc18f057cc1 | |
parent | 86ded90c6ee1b5ede09ed65b450e2918a2ba6d17 (diff) | |
download | sqlalchemy-cde133c45d01848cd5696113fe94f269b7fe8d9c.tar.gz |
merged merge fix from r4834/rel_0_4 branch
-rw-r--r-- | CHANGES | 3 | ||||
-rw-r--r-- | lib/sqlalchemy/databases/postgres.py | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/interfaces.py | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/properties.py | 5 | ||||
-rw-r--r-- | test/orm/merge.py | 29 |
5 files changed, 37 insertions, 4 deletions
@@ -77,6 +77,9 @@ user_defined_state will alias() the secondary (association) table so that multiple contains() calls will not conflict with each other [ticket:1058] + + - fixed bug preventing merge() from functioning in + conjunction with a comparable_property() - mysql - Added 'CALL' to the list of SQL keywords which return diff --git a/lib/sqlalchemy/databases/postgres.py b/lib/sqlalchemy/databases/postgres.py index 2f4865e96..430fdc61a 100644 --- a/lib/sqlalchemy/databases/postgres.py +++ b/lib/sqlalchemy/databases/postgres.py @@ -675,7 +675,7 @@ class PGCompiler(compiler.DefaultCompiler): text += " OFFSET " + str(select._offset) return text - def get_select_precolumns(self, select): + def dont_get_select_precolumns(self, select): if select._distinct: if isinstance(select._distinct, bool): return "DISTINCT " diff --git a/lib/sqlalchemy/orm/interfaces.py b/lib/sqlalchemy/orm/interfaces.py index 7b120e884..eb333dfd2 100644 --- a/lib/sqlalchemy/orm/interfaces.py +++ b/lib/sqlalchemy/orm/interfaces.py @@ -398,7 +398,7 @@ class MapperProperty(object): return not self.parent.non_primary - def merge(self, session, source, dest): + def merge(self, session, source, dest, dont_load, _recursive): """Merge the attribute represented by this ``MapperProperty`` from source to destination object""" diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py index 792824fe3..1ce71fdb6 100644 --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@ -192,7 +192,7 @@ class SynonymProperty(MapperProperty): strategies.DefaultColumnLoader(self)._register_attribute(None, None, False, comparator_callable, proxy_property=self.descriptor) - def merge(self, session, source, dest, _recursive): + def merge(self, session, source, dest, dont_load, _recursive): pass SynonymProperty.logger = log.class_logger(SynonymProperty) @@ -215,6 +215,9 @@ class ComparableProperty(MapperProperty): def create_row_processor(self, selectcontext, path, mapper, row, adapter): return (None, None) + def merge(self, session, source, dest, dont_load, _recursive): + pass + class PropertyLoader(StrategizedProperty): """Describes an object property that holds a single item or list diff --git a/test/orm/merge.py b/test/orm/merge.py index 3d35397fb..e8502d891 100644 --- a/test/orm/merge.py +++ b/test/orm/merge.py @@ -1,7 +1,7 @@ import testenv; testenv.configure_for_tests() from testlib import sa, testing from testlib.sa.util import OrderedSet -from testlib.sa.orm import mapper, relation, create_session +from testlib.sa.orm import mapper, relation, create_session, PropComparator, synonym, comparable_property from testlib.testing import eq_, ne_ from orm import _base, _fixtures @@ -670,6 +670,33 @@ class MergeTest(_fixtures.FixtureTest): except sa.exc.InvalidRequestError, e: assert "dont_load=True option does not support" in str(e) + @testing.resolve_artifact_names + def test_synonym_comparable(self): + class User(object): + + class Comparator(PropComparator): + pass + + def _getValue(self): + return self._value + + def _setValue(self, value): + setattr(self, '_value', value) + + value = property(_getValue, _setValue) + + mapper(User, users, properties={ + 'uid':synonym('id'), + 'foobar':comparable_property(User.Comparator,User.value), + }) + + sess = create_session() + u = User() + u.name = 'ed' + sess.save(u) + sess.flush() + sess.expunge(u) + sess.merge(u) if __name__ == "__main__": testenv.main() |