this is likely a bug. try out the patch below (against the latest 0.5 release):
Index: lib/sqlalchemy/orm/state.py =================================================================== --- lib/sqlalchemy/orm/state.py (revision 6049) +++ lib/sqlalchemy/orm/state.py (working copy) @@ -111,8 +111,8 @@ return None elif hasattr(impl, 'get_collection'): return impl.get_collection(self, dict_, x, passive=passive) - elif isinstance(x, list): - return x +# elif isinstance(x, list): +# return x else: return [x] Roel van Os wrote: > > Hi all, > > In my program I'm using PGArray to store a list of strings in the > database (defined as text[] in the schema). > > When I use Session.merge to create a copy of an object in the current > session, the list is converted to a single string (the first from the > list) in the copy. I've placed an example below. dont_load True or False > doesn't make a difference. > > I've tested with SQLAlchemy 0.5.4 and 0.4.6. > > Any idea what the problem might be and what I can do about it? > > Thanks, > Roel van Os > > Example code: > > #!/usr/bin/env python > from sqlalchemy import * > from sqlalchemy.sql import * > from sqlalchemy.orm import * > from sqlalchemy.ext.declarative import declarative_base > from sqlalchemy.databases.postgres import PGArray > > Base = declarative_base() > > class TestClass(Base): > __tablename__ = 'testclass' > > id = Column(Integer, primary_key=True) > test_array = Column(PGArray(Text)) > > dburl = 'postgres://xxxx:x...@xxxx/xxxx' > engine = create_engine(dburl, convert_unicode=True, echo=False, > pool_recycle=60) > Session = sessionmaker(bind=engine) > Base.metadata.create_all(engine) > > # Create a test object > s1 = Session() > o1 = TestClass(test_array=['1', '2', '3']) > s1.save(o1) > s1.commit() > o1_id = o1.id > s1.close() > > # Load the test object > s2 = Session() > o2 = s2.query(TestClass).get(o1_id) > print o2.test_array > assert len(o2.test_array) == 3 > > # Merge the object into another session > s3 = Session() > o3 = s3.merge(o2, dont_load=True) > > # Should print the same as above, but prints "1" > print o3.test_array > assert len(o3.test_array) == 3 > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---