2015-03-05 11 views
11

voglio clonare un oggetto sqlalchemy:Come clonare un oggetto sqlalchemy db con la nuova chiave primaria

ho provato da

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) 

si tratta solo di aggiornamento del old_object solo

qui è il codice della funzione products.save

class Service(object): 

     __model__ = None 

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

risposta

17

Questo dovrebbe funzionare:

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

Sembra piuttosto fastidioso che make_transient non rimuove la chiave primaria. Non avrebbe senso se la creazione di una copia di una voce fosse il caso d'uso principale? – SebK

+2

@SebK Il fatto è che potrebbe essere necessaria una copia dell'oggetto senza alterare il PK (per qualsiasi motivo). Mantenendo il PK, l'API è più inclusiva, in quanto è più pulito cambiare l'ID quando ne hai bisogno piuttosto che mantenere un riferimento ID nel caso in cui ne hai bisogno. –

+0

Grazie! Note anche per i newbees come me che (1) trovano make_transient in 'da sqlalchemy.orm.session import make_transient' e (2) impostando la chiave primaria su None verrà quindi utilizzata la chiave primaria auto-generate su' session.add (obj) 'e' session.commit() '. –

1

Un possibile approccio è quello di utilizzare dictalchemy:

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