2015-03-05 7 views
11

ich ein sqlalchemy Objekt klonen klonen möchten: Wie ein sqlalchemy db Objekt mit neuen Primärschlüssel

product_obj = products.all()[0] #here products is service name 

product_obj.product_uid = 'soemthing' #here product_uid is the pk of product model 

products.save(product_obj) 

von

ich es versucht, ist es nur die old_object nur

Aktualisierung hier

ist der Code von products.save Funktion

class Service(object): 

     __model__ = None 

     def save(self, model): 
      self._isinstance(model) 
      db.session.add(model) 
      db.session.commit() 
      return model 

Antwort

17

Diese Arbeit sollte:

product_obj = products.all()[0] 

db.session.expunge(product_obj) # expunge the object from session 
make_transient(product_obj) # http://docs.sqlalchemy.org/en/rel_1_1/orm/session_api.html#sqlalchemy.orm.session.make_transient 

product_obj.product_uid = 'something' 
db.session.add(product_obj) 
+1

Es scheint ziemlich ärgerlich, dass make_transient nicht den Primärschlüssel nicht entfernt. Wäre das nicht sinnvoll, wenn das Erstellen einer Kopie eines Eintrags der primäre Anwendungsfall ist? – SebK

+2

@SebK Die Sache ist, dass Sie möglicherweise eine Kopie des Objekts benötigen, ohne die PK (aus welchen Gründen auch immer) zu ändern. Durch das Beibehalten der PK ist die API umfassender, da es einfacher ist, die ID zu ändern, wenn Sie sie benötigen, als eine ID-Referenz zu behalten, falls Sie sie benötigen. –

+0

Danke! Auch Hinweise für newbees wie mich, dass (1) make_transient in 'von sqlalchemy.orm.session import make_transient' finden und (2) das Setzen des Primärschlüssels auf None verwendet dann den automatisch generierten Primärschlüssel in' session.add (obj) 'und' session.commit() '. –

1

Ein möglicher Ansatz ist dictalchemy zu verwenden:

new_instance = InstanceModel(**old_instance.asdict()) 
Verwandte Themen