2013-01-31 15 views
18

मैं ओआरएम का उपयोग कर एसक्लाक्लेमी में एक मॉडल उदाहरण (पंक्ति) को डुप्लिकेट करना चाहता हूं। मेरी पहली सोचा यह करने के लिए किया गया था:स्क्लेक्लेमी: पृथक ऑब्जेक्ट का संशोधन

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

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

हालांकि, जाहिरा तौर पर अलग वस्तु अभी भी "याद" क्या आईडी यह था, फिर भी मैं कोई नहीं करने के लिए आईडी सेट, जबकि यह अलग किया गया था। इस प्रकार, session.flush() प्राथमिक कुंजी को शून्य करने के लिए अद्यतन अद्यतन को निष्पादित करने का प्रयास करता है।

क्या यह अपेक्षित व्यवहार है? मैं इस विशेषता की 'मेमोरी' को कैसे हटा सकता हूं, और बस अलग-अलग ऑब्जेक्ट को सत्र में फिर से जोड़ने पर एक नई वस्तु के रूप में व्यवहार कर सकता हूं? सामान्य रूप से, कैसे एक स्क्लेक्लेमी मॉडल उदाहरण क्लोन करता है?

उत्तर

34

इस मामले make_transient() सहायक फ़ंक्शन का उपयोग उपलब्ध है:

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

धन्यवाद, डॉक्स में यह नहीं देखा। –

+4

संबंधों को प्रतिलिपि बनाने का उचित तरीका क्या है, @zzzeek? – jmagnusson

+0

मुझे भी इसी तरह की दिलचस्पी है। मुझे एक इकाई (एक पंक्ति) को क्लोन करने में दिलचस्पी है, साथ ही साथ इसके सभी 'बच्चे' इकाइयों (अन्य पंक्तियों में पंक्तियां, इस पंक्ति पर इंगित विदेशी कुंजी के साथ), और इस नई डुप्लिकेट पंक्ति और उसके डुप्लिकेट बच्चों को एक नई मूल इकाई से जोड़ना नई डुप्लिकेट पंक्ति में एक अलग विदेशी कुंजी के माध्यम से (लेकिन मौजूदा इकाई और उसके बच्चे इकाइयों को प्रभावित किए बिना)। मैं SO पर एक अन्य प्रश्न पर यह आंशिक उत्तर देख सकता हूं: 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

यदि आपकी ऑब्जेक्ट 'लंबित है, तो यह नहीं कोई संबंध नहीं है। अर्थात। विदेशी कुंजी कॉलम तब तक पॉप्युलेट नहीं किए गए हैं। – gromgull

+0

यह विधियों और संकर विशेषताओं की प्रतिलिपि नहीं करता है। – Jakobovski

संबंधित मुद्दे