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