On Mar 10, 2013, at 10:28 AM, Massi <massi_...@msn.com> wrote:

> Hi everyone,
> 
> in my script I'm using column_mapped_collection to create a collection 
> indexed by a column of a certain table. This is an example scenario (pseudo 
> code):
> 
> class Parent(object):
>     def __init__(self):
>          # define some fileds
> 
>     def AddChild(self, new_child):
>          self.children[new_child.name] = new_child
> 
> class Child(object):
>     def __init__(self, name):
>         self.name = name
> 
> rel = relationship(Child, 
> collection_class=column_mapped_collection(child_tab.c.name))
> mapper(Parent, parent_tab, properties={"children":rel})
> mapper(Child, child_tab)
> 
> p = Parent()
> p.AddChild(Child("child1"))
> p.AddChild(Child("child2"))
> session.add(p)
> session.commit()
> 
> Everything works fine except for the fact that after the commit it generally 
> happens that the insertion order is not respected, that is the child2 record 
> is stored before child1. Is there a way to modify the code so that the 
> insertion order is preserved? I think this is somehow linked to the use of 
> Ordereddict but I have no idea about how to achieve it!
> Any help is appreciated, thanks in advance!

OK in this case, it's true that using an OrderedDict would help.  There is a 
way to map to an OrderedDict here, though it's not very convenient as you'd 
need to build it either from scratch or by subclassing the existing 
MappedCollection class, and then there's some other boilerplate-ish/not really 
public utilities that the attribute_mapped_collection and 
column_mapped_collection callables make use of, though they aren't strictly 
necessary.   

But all of that can be bypassed if you're OK with being more specific as to how 
you put the objects in the Session.  Ultimately, insert order is determined by 
the order in which the objects were put into the Session.  So here, if you were 
to session.add(p) *first*, then add the Child objects, each one gets cascaded 
into the Session at the moment you add them to the collection, and that's the 
insert order.  Or, if you session.add() each child *before* it goes into the 
Session via session.add(p), that will also work. 



> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
> For more options, visit https://groups.google.com/groups/opt_out.
>  
>  

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to