Channel is just type of object. I realize what my problem is. I don't
know why my object isn't saved correctly.

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

On Sep 13, 2:47 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> 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 
> > 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.

Reply via email to