I have a need to clone an instance of a mapped class and insert the new
instance in my database with only minor changes to attributes. To do this I
want to create a new instance of the class with all non-key attributes
copied from the old instance. Primary keys and foreign keys will be
populated at insert time via normal processes for any instance.

Here is a function I wrote to clone the non-key attributes to a new
instance. Does this make sense or might I stumble into an unseen abyss
somewhere, or is there an easier way to do this? (I did not use copy.copy()
because I only want the non-key attributes copied)
None of the classes involve polymorphism which is one area I thought there
might be trouble.
All of our classes use the default declarative __init__(), so the statement
new = cls()  is valid in all cases.

def clone_instance(old):
    cls = old.__class__
    tbl = cls.__table__
    new = cls()
    for c in tbl.c:
        if c.primary_key or c.foreign_keys:
            continue
        setattr(new, c.name, getattr(old,c.name))
    return new


usage is something like this

obj = session.query(SomeClass).get(someid)
newobj = clone_instance(obj)
newobj.someattribute = some different value
session.add(newobj)
session.commit()

This seems to work for the simple cases I ran so far, just wondering if
there are any hidden problems or simplifications.

-- 
Mike Conley

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@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