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