I have detected the sole codepath which does in fact produce the output you've seen which is also erroneous. That issue is fixed in r5661. However, the reproduction of the bug is doesn't appear possible with the scenario you describe, which suggests that your serialization/merge scheme may still be producing data that is not what's expected.
The reproduction of the error is via issuing a session.delete() for the object, then issuing session.add() for a brand new object which has no values set in the child table, but includes the primary key of the original object. It is not possible to produce this effect using merge() since merge() will never result in an INSERT for a primary key value that already exists in the database or session. Also, my analysis of the issue also has led me to rethink the feature in question (called a row switch), so I will almost certainly be changing the behavior of it once again in 0.6 to issue an explicit DELETE and INSERT for a delete()/add() pair of the same primary key. So if we don't figure out how your pickle/merge() scenario is being interpreted as a delete()/add() pair, this eventual change might again cause problems for you even if the issue is resolved for now. On Jan 13, 2009, at 12:03 AM, Michael Bayer wrote: > > > On Jan 12, 2009, at 11:37 PM, Duder wrote: >> missing from the object, so it is generating bad SQL. Is this a bug, >> or do I need to change something to be compatible with 0.5.0? > > > its impossible to say without a full reproducing test case. I've > tried many versions of the test below and none have any issue: > > from sqlalchemy import * > from sqlalchemy.orm import * > from sqlalchemy.ext.declarative import declarative_base > import cPickle as pickle > > engine = create_engine('sqlite://', echo=True) > Base = declarative_base() > class Person(Base): > __tablename__ = 'people' > id = Column('id', Integer, primary_key=True) > name = Column('name', String(50)) > discriminator = Column('type', String(50)) > __mapper_args__ = {'polymorphic_on':discriminator} > > class Engineer(Person): > __tablename__ = 'engineers' > __mapper_args__ = {'polymorphic_identity':'engineer'} > id = Column('id', Integer, ForeignKey('people.id'), > primary_key=True) > primary_language = Column('primary_language', String(50)) > > Base.metadata.create_all(engine) > > e1 = Engineer(name="dilbert", primary_language="java") > > sess = sessionmaker(engine)() > sess.add(e1) > > sess.commit() > > e1 = sess.query(Person).filter(Person.name=='dilbert').one() > > assert 'primary_language' not in e1.__dict__ > assert 'name' in e1.__dict__ > > sess.expunge(e1) > > # "serialize to the client" > e2 = pickle.loads(pickle.dumps(e1)) > > # client changes something (?) > e2.name = 'ed' > > # "deserialize from the client" > e3 = pickle.loads(pickle.dumps(e2)) > > # merge > e1 = sess.merge(e3) > sess.commit() > > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---