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 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.

Reply via email to