2015-03-05 21 views
11
Bir sqlalchemy nesnesi klonlamak istiyorum

ile sqlalchemy db nesnesi klonlamak için:yeni birincil anahtar

Bunu sadece old_object sadece

burada

olduğu güncelliyor

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) 

tarafından denedim Bu çalışması gerekir

class Service(object): 

     __model__ = None 

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

cevap

17

products.save fonksiyonunun kodu:

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

Bu make_transient birincil anahtar kaldırmaz bu oldukça can sıkıcı görünüyor. Bir girişin bir kopyasını oluşturmak birincil kullanım durumu ise bu mantıklı olmaz mıydı? – SebK

+2

@SebK Nesnenin bir kopyasını PK'yi değiştirmeden (her ne sebeple olursa olsun) gerekebilir. PK'yi koruyarak API daha fazla kapsayıcıdır. İhtiyacınız olduğunda ID'yi değiştirmeniz gerektiğinden daha fazla temiz olması gerekir. –

+0

Teşekkürler! Ayrıca benim gibi yenileri için (1) make sqlchemy.orm.session import make_transient öğesinden make_transient öğesini ve (2) birincil anahtarının None olarak ayarlanmasını, "session.add (obj)" de otomatik oluşturulmuş birincil anahtarı kullanacağını belirtir. 've' session.commit() '. –

1

Olası bir yaklaşım dictalchemy kullanmaktır:

new_instance = InstanceModel(**old_instance.asdict()) 
İlgili konular