Yes, I've done that. I doesn't work either.

                        for chan in channels:
                                if chan.id == channel.id:
                                        chan = session.merge(channel)
                                        break

On Sep 13, 2:27 pm, Michael Bayer <[email protected]> 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 <[email protected]> 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 [email protected].
> > To unsubscribe from this group, send email to 
> > [email protected].
> > 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 [email protected].
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.

Reply via email to