2015-03-05 15 views
11

chcę sklonować obiektu sqlalchemy:Jak sklonować obiektu sqlalchemy dB nowego klucza podstawowego

Próbowałem go

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) 

jest tylko aktualizowanie old_object tylko

tutaj jest kod funkcji products.save:

class Service(object): 

     __model__ = None 

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

Odpowiedz

17

Powinno to zadziałać:

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

Wydaje się dość irytujące, że make_transient nie usuwa klucz podstawowy. Czy nie ma to sensu, jeśli tworzenie kopii wpisu jest podstawowym przypadkiem użycia? – SebK

+2

@SebK Chodzi o to, że możesz potrzebować kopii obiektu bez zmiany PK (z jakichkolwiek powodów). Zachowując PK, API jest bardziej wszechstronny, ponieważ łatwiej jest zmienić identyfikator, kiedy jest to potrzebne, niż utrzymywać referencję ID na wypadek, gdyby była potrzebna. –

+0

Dzięki! Zauważa także, że newbees jak ja (1) znajduje make_transient w 'from sqlalchemy.orm.session import make_transient' oraz (2) ustawiając klucz podstawowy na None, użyje automatycznie generującego klucz podstawowy na' session.add (obj) 'i' session.commit() '. –

1

Jednym z możliwych rozwiązań jest użycie dictalchemy:

new_instance = InstanceModel(**old_instance.asdict()) 
Powiązane problemy