On Sep 13, 2010, at 2:31 PM, Alvaro Reinoso wrote: > Yes, I've done that. I doesn't work either. > > for chan in channels: > if chan.id == channel.id: > chan = session.merge(channel) > break
i dont understand the context of that code (what's "channel") ? This is how a basic merge works: def merge_new_data(some_xml): my_objects = parse_xml(some_xml) # at this point, every object in "my_objects" should # have a primary key, as well as every child of every element, # all the way down. Existing primary keys must be fully populated, # that's your job. This is the intricate part, obviously. But you don't # merge anything here, just get the PKs filled in. # then you merge the whole thing. merge() cascades along all # relationships. The rule is simple - if PK is present and exists in the DB, it # updates. otherwise, it inserts. for obj in my_objects: Session.merge(obj) Session.commit() # done > > On Sep 13, 2:27 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: >> On Sep 13, 2010, at 2:13 PM, Alvaro Reinoso wrote: >> >> >> >>> If I merge the updated channel like you can see in this piece of code >>> it's working: >> >>> def insertXML(channels, strXml): >>> """Insert a new channel given XML string""" >>> channel = Channel() >>> session = rdb.Session() >> >>> channel.fromXML(strXml) >>> fillChannelTemplate(channel, channels) >>> for item in channel.items: >>> if item.id == 0: >>> item.id = None >>> break >>> session.merge(channel) >> >>> for chan in channels: >>> if chan.id == channel.id: >>> chan.items.append(item) >>> break >> >>> My problem is I'm using channels, it's a list of channels which I save >>> it in HTTP session object. The channels list is a detached object >>> which I get using joinload option. So in this case, I update the >>> object correctly in database, but It isn't persistent in channels if I >>> do this: >> >>> for chan in channels: >>> if chan.id == channel.id: >>> chan.items.append(item) >>> break >> >>> Do you have any idea how I can solve this problem? or another >>> approach? >> >> here: >> >>> session.merge(channel) >> >> use the return value of merge(): >> >> channel = session.merge(channel) >> >> the returned channel plus all children is the fully merged result. >> >> >> >>> Thanks! >> >>> On Sep 10, 5:09 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: >>>> On Sep 10, 2010, at 2:57 PM, Alvaro Reinoso wrote: >> >>>>> Hello guys, >> >>>>> I have this table: >> >>>>> class Channel(rdb.Model): >>>>> rdb.metadata(metadata) >>>>> rdb.tablename("channels") >> >>>>> id = Column("id", Integer, primary_key=True) >>>>> title = Column("title", String(100)) >>>>> hash = Column("hash", String(50)) >>>>> runtime = Column("runtime", Float) >> >>>>> items = relationship(MediaItem, secondary="channel_items", >>>>> order_by=MediaItem.position, backref="channels") >> >>>>> I have a list of channels, but they are detached objects. I get them >>>>> using joinedload option because I maniputale those objects sometimes. >>>>> When I do that, I update the object. >> >>>>> This time, I'm trying to add a new item to a detached channel object. >>>>> This is the code: >> >>>>> def insertXML(channels, strXml): >>>>> """Insert a new channel given XML string""" >>>>> channel = Channel() >>>>> session = rdb.Session() >>>>> result = "" >> >>>>> channel.fromXML(strXml) >>>>> fillChannelTemplate(channel, channels) >>>>> if channel.id == 0: >>>>> session.add(channel) >>>>> session.flush() >>>>> channels.append(channel) >>>>> else: >>>>> for chan in channels: >>>>> if chan.id == channel.id: >>>>> chan.runtime = channel.runtime >>>>> chan.modified = datetime.date.today() >> >>>>> for item in channel.items: >>>>> if item.id == 0: >>>>> chan.items.append(item) >> >>>>> session.merge(chan) >> >>>>> The item is inserted in the database, but It doesn't create the >>>>> relation in channel_items. >> >>>>> Besides, I get this error: >> >>>>> FlushError: New instance <Channel at 0xb75eeec> with identity key >>>>> (<class 'zeppelinlib.channel.ChannelTest.Channel'>, (152,)) conflicts >>>>> with persistent instance <Channel at 0xb598dec >> >>>> anytime you have that error you should be using merge() to merge state >>>> into that which is already existing, the return value from merge() is then >>>> what you need to use for your new state. I see you tried using merge >>>> earlier but your issue is not clear. >> >>> -- >>> 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. > -- 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.