On Dec 21, 2007, at 3:54 PM, Anton V. Belyaev wrote: > > 1) I created an object with deferred property (not None). > 2) Reloaded it in a new session (to "erase" deferred property) > 3) Pickled/Unpickled > 4) Removed everything but properties and _state.
what did you remove exactly ? there are some attributes on the instance, such as _instance_key and _entity_name, which should not be erased. also any attribute which doesnt have a deferred or expired flag on it shouldnt be erased either. if you want to remove attributes, use session.expire(instance, ['key1', 'key2', ...]). a test script illustrating pickling/unpickling, which uses update(), is attached. > > 5) obj = s.merge(obj, dont_load=True) (with a fresh session s) merge is still not working, it raises an exception in this case. will have a fix soon. --~--~---------~--~----~------------~-------~--~----~ 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 [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---
from sqlalchemy import * from sqlalchemy.orm import * import pickle engine = create_engine('sqlite://', echo=True) metadata = MetaData(engine) users = Table('users', metadata, Column('id', Integer, primary_key=True), Column('name', String(30), nullable=False)) users.create() class User(object): pass mapper(User, users, properties={ 'name':deferred(users.c.name) }) u1 = User() u1.name = 'ed' sess = create_session() sess.save(u1) sess.flush() sess.clear() u2 = sess.query(User).get(u1.id) assert 'name' not in u2.__dict__ u3 = pickle.loads(pickle.dumps(u2)) sess2 = create_session() sess2.update(u3) # not working yet #u3 = sess2.merge(u3, dont_load=True) assert 'name' not in u3.__dict__ assert u3.name == 'ed'