Thanks, and I knew I had brought up similar behavior before, but it was in the context of merge() by itself (with composite primary keys). Before I was wondering why merge expires columns that merge() originally fetched. This seemed like a different issue to me on the surface, because in this case, I *already* have the persistent instance in the session *before* calling merge, and merge expired it anyway.
Thanks for your help. On Feb 21, 2:09 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: > On Feb 21, 2010, at 2:03 PM, Michael Bayer wrote: > > > > > > > On Feb 21, 2010, at 1:51 PM, Michael Bayer wrote: > > >> On Feb 20, 2010, at 5:12 PM, Kent wrote: > > >>> If I have a persistent instance in my session and I call merge on an > >>> object that equates to that instance, some attributes (it seems those > >>> that aren't explicitly set on the merging instance) are expired and > >>> get re-queried the next time they are referenced. > > >>> We will be supporting remote databases and I may be iterating at some > >>> points over hundreds or more records that I've already queried and are > >>> persistent, so I wish these wouldn't expire. > > >>> Is this behavior intentional? > > >> I think we already mentioned this in a previous email. yes, that is the > >> current behavior and is intentional. If you'd like these to be merged in > >> as None, set them to None on your incoming instance. Otherwise their > >> value is undefined and it is the correct behavior for them to be fetched > >> from the database when requested. > > > I think we also mentioned that i was going to investigate limiting this > > behavior to the load=False condition. that issue still remains as the > > single test we have which fails upon changing the behavior uses load=False. > > yes, its ticket #1681. the issue has already been logged and here is the > message where I mentioned as much: > http://groups.google.com/group/sqlalchemy/msg/6057ea3a24a548e9? > > > > >>> Version 0.5.8 > > >>> For example, see the output from this simple script: > > >>> ================================= > > >>> from sqlalchemy import * > >>> from sqlalchemy.orm import * > > >>> engine = create_engine('postgres://kb:k...@localhost:5444/kb',echo=True) > >>> metadata = MetaData() > >>> Session = sessionmaker(bind=engine) > >>> DBSession = Session() > > >>> order_table = Table("orders", metadata, > >>> Column("orderid", Unicode, primary_key=True), > >>> Column("type", Unicode) > >>> ) > > >>> class Order(object): > >>> pass > > >>> order_mapper = mapper(Order, order_table) > > >>> #metadata.create_all(engine) > > >>> o=Order() > >>> o.orderid=u'SALE25863' > > >>> DBSession.query(Order).get(u'SALE25863') > > >>> merged=DBSession.merge(o) > > >>> merged.orderid > >>> merged.type #<------------At this point, type is expired > >>> ################ > > >>> ================================================== > > >>> output: > >>> ================================================== > >>>>>> from sqlalchemy.orm import * > > >>>>>> engine = > >>>>>> create_engine('postgres://kb:k...@localhost:5444/kb',echo=True) > >>>>>> metadata = MetaData() > >>>>>> Session = sessionmaker(bind=engine) > >>>>>> DBSession = Session() > > >>>>>> order_table = Table("orders", metadata, > >>> ... Column("orderid", Unicode, primary_key=True), > >>> ... Column("type", Unicode) > >>> ... ) > > >>>>>> class Order(object): > >>> ... pass > >>> ... > >>>>>> order_mapper = mapper(Order, order_table) > > >>>>>> #metadata.create_all(engine) > >>> ... > >>>>>> o=Order() > >>>>>> o.orderid=u'SALE25863' > > >>>>>> DBSession.query(Order).get(u'SALE25863') > >>> 2010-02-20 05:55:11,859 INFO sqlalchemy.engine.base.Engine.0x...2cd0 > >>> BEGIN > >>> 2010-02-20 05:55:11,863 INFO sqlalchemy.engine.base.Engine.0x...2cd0 > >>> SELECT orders.orderid AS orders_orderid, orders.type AS orders_type > >>> FROM orders > >>> WHERE orders.orderid = %(param_1)s > >>> 2010-02-20 05:55:11,864 INFO sqlalchemy.engine.base.Engine.0x...2cd0 > >>> {'param_1': 'SALE25863'} > >>> <__main__.Order object at 0x14ee710> > > >>>>>> merged=DBSession.merge(o) > > >>>>>> merged.orderid > >>> u'SALE25863' > > >>> ################################# > >>>>>> merged.type #<------------At this point, type is expired > >>>>>> ################ > >>> 2010-02-20 05:55:11,870 INFO sqlalchemy.engine.base.Engine.0x...2cd0 > >>> SELECT orders.type AS orders_type > >>> FROM orders > >>> WHERE orders.orderid = %(param_1)s > >>> 2010-02-20 05:55:11,870 INFO sqlalchemy.engine.base.Engine.0x...2cd0 > >>> {'param_1': 'SALE25863'} > >>> u'SAL' > > >>> -- > >>> You received this message because you are subscribed to the Google Groups > >>> "sqlalchemy" group. > >>> To post to this group, send email to sqlalch...@googlegroups.com. > >>> To unsubscribe from this group, send email to > >>> sqlalchemy+unsubscr...@googlegroups.com. > >>> For more options, visit this group > >>> athttp://groups.google.com/group/sqlalchemy?hl=en. > > >> -- > >> You received this message because you are subscribed to the Google Groups > >> "sqlalchemy" group. > >> To post to this group, send email to sqlalch...@googlegroups.com. > >> To unsubscribe from this group, send email to > >> sqlalchemy+unsubscr...@googlegroups.com. > >> For more options, visit this group > >> athttp://groups.google.com/group/sqlalchemy?hl=en. > > > -- > > You received this message because you are subscribed to the Google Groups > > "sqlalchemy" group. > > To post to this group, send email to sqlalch...@googlegroups.com. > > To unsubscribe from this group, send email to > > sqlalchemy+unsubscr...@googlegroups.com. > > For more options, visit this group > > athttp://groups.google.com/group/sqlalchemy?hl=en. > > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@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.