From: Mike Bayer Date: Mon, 15 Jun 2009 22:23:08 +0000 (+0000) Subject: - Fixed bug whereby list-based attributes, like pickletype X-Git-Tag: rel_0_5_5~16 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=964fac813c205a5f8656f8cbe2bb77815e5f3556;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Fixed bug whereby list-based attributes, like pickletype and PGArray, failed to be merged() properly. --- diff --git a/CHANGES b/CHANGES index 638c5e356e..e031ade3cd 100644 --- a/CHANGES +++ b/CHANGES @@ -28,6 +28,9 @@ CHANGES so applications which relied on this erroneous result need to be adjusted. [ticket:1431] + - Fixed bug whereby list-based attributes, like pickletype + and PGArray, failed to be merged() properly. + - The "foreign_keys" argument of relation() will now propagate automatically to the backref in the same way that primaryjoin and secondaryjoin do. For the extremely diff --git a/lib/sqlalchemy/orm/state.py b/lib/sqlalchemy/orm/state.py index 92500758ff..6894b8f85f 100644 --- a/lib/sqlalchemy/orm/state.py +++ b/lib/sqlalchemy/orm/state.py @@ -111,8 +111,6 @@ class InstanceState(object): return None elif hasattr(impl, 'get_collection'): return impl.get_collection(self, dict_, x, passive=passive) - elif isinstance(x, list): - return x else: return [x] diff --git a/test/orm/test_merge.py b/test/orm/test_merge.py index 70097cbee2..f4e3872b06 100644 --- a/test/orm/test_merge.py +++ b/test/orm/test_merge.py @@ -1,14 +1,16 @@ from sqlalchemy.test.testing import assert_raises, assert_raises_message import sqlalchemy as sa +from sqlalchemy import Table, Column, Integer, PickleType +import operator from sqlalchemy.test import testing from sqlalchemy.util import OrderedSet -from sqlalchemy.orm import mapper, relation, create_session, PropComparator, synonym, comparable_property +from sqlalchemy.orm import mapper, relation, create_session, PropComparator, synonym, comparable_property, sessionmaker from sqlalchemy.test.testing import eq_, ne_ from test.orm import _base, _fixtures class MergeTest(_fixtures.FixtureTest): - """Session..merge() functionality""" + """Session.merge() functionality""" run_inserts = None @@ -731,5 +733,33 @@ class MergeTest(_fixtures.FixtureTest): sess.commit() - +class MutableMergeTest(_base.MappedTest): + @classmethod + def define_tables(cls, metadata): + Table("data", metadata, + Column('id', Integer, primary_key=True), + Column('data', PickleType(comparator=operator.eq)) + ) + + @classmethod + def setup_classes(cls): + class Data(_base.ComparableEntity): + pass + + @testing.resolve_artifact_names + def test_list(self): + mapper(Data, data) + sess = sessionmaker()() + d = Data(data=["this", "is", "a", "list"]) + + sess.add(d) + sess.commit() + + d2 = Data(id=d.id, data=["this", "is", "another", "list"]) + d3 = sess.merge(d2) + eq_(d3.data, ["this", "is", "another", "list"]) + + + +