2013-01-31 11 views
18

Bir ornek kullanarak SQLAlchemy'de bir model örneğini (satır) çoğaltmak istiyorum. Benim ilk düşünce bunu idi:SQLAlchemy: Ayrılmış nesnenin değiştirilmesi

i = session.query(Model) 
session.expunge(i) 

old_id = i.id 
i.id = None 
session.add(i) 
session.flush() 
print i.id #New ID 

Ancak görünüşe müstakil nesne hala o müstakil iken ben Yok olarak id set bile, ne vardı id "hatırlar". Böylece, session.flush(), birincil anahtarı null olarak değiştirerek bir UPDATE yürütmeyi dener.

Bu beklenen davranış? Bu özniteliğin 'belleğini' nasıl kaldırabilirim ve yalnızca ayrılmış nesneyi yeniden oturum üzerine ekledikten sonra yeni bir nesne olarak ele alabilir miyim? Genel olarak, bir SQLAlchemy model örneğini nasıl klonlar?

cevap

34

bu durumda make_transient() yardımcı işlevini kullanarak mevcuttur:

inst = session.query(Model).first() 
session.expunge(inst) 

make_transient(inst) 
inst.id = None 
session.add(inst) 
session.flush() 
print inst.id #New ID 
+0

sayesinde dokümanlar bunu görmedi. –

+4

İlişkileri kopyalamanın uygun yolu nedir, @zzzeek? – jmagnusson

+0

Ben de benzer bir şeyle ilgileniyorum. Bir varlığın (satır), tüm “çocuk” varlıkları ile birlikte (diğer satırlardaki satırlar, bu sıraya işaret eden yabancı anahtarlar ile) klonlanması ve bu yeni yinelenen satırın ve yinelenen çocukların yeni bir ana öğeye bağlanmasıyla ilgileniyorum Yeni çoğaltılmış satırdaki farklı bir yabancı anahtar aracılığıyla (ancak var olan varlığı ve onun çocuk varlıklarını etkilemeden). Bu kısmi cevabı SO hakkındaki başka bir soruda görebiliyorum: http://stackoverflow.com/questions/20112850/sqlalchemy-clone-table-row-with-relations?lq=1 – Soferio

1
def duplicate(self): 
    arguments = dict() 
    for name, column in self.__mapper__.columns.items(): 
     if not (column.primary_key or column.unique): 
      arguments[name] = getattr(self, name) 
    return self.__class__(**arguments) 
+0

Nesneniz "beklemede" ise, bu herhangi bir ilişki. Yani Yabancı anahtar sütunları henüz doldurulmuyor. – gromgull

+0

Ayrıca, yöntemleri ve karma öznitelikleri kopyalamaz. – Jakobovski