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'



Reply via email to