summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2008-06-03 14:33:08 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2008-06-03 14:33:08 +0000
commitcde133c45d01848cd5696113fe94f269b7fe8d9c (patch)
tree8f03c243549f33daff3062ec38c2fcc18f057cc1
parent86ded90c6ee1b5ede09ed65b450e2918a2ba6d17 (diff)
downloadsqlalchemy-cde133c45d01848cd5696113fe94f269b7fe8d9c.tar.gz
merged merge fix from r4834/rel_0_4 branch
-rw-r--r--CHANGES3
-rw-r--r--lib/sqlalchemy/databases/postgres.py2
-rw-r--r--lib/sqlalchemy/orm/interfaces.py2
-rw-r--r--lib/sqlalchemy/orm/properties.py5
-rw-r--r--test/orm/merge.py29
5 files changed, 37 insertions, 4 deletions
diff --git a/CHANGES b/CHANGES
index 841a62275..4a08007cd 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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()