में प्रतिलिपि और गहरी प्रतिलिपि में सहायता करें मुझे लगता है कि मैंने my previous question में बहुत अधिक मांगने की कोशिश की है, इसलिए इसके लिए क्षमा करें। मुझे अपनी स्थिति को इस तरह से सरल तरीके से प्रस्तुत करने दें जैसे मैं कर सकता हूं।पायथन
असल में, मुझे शब्दकोशों का एक समूह मिला है जो मेरी वस्तुओं का संदर्भ देता है, जो बदले में एसक्यूएलकेमी का उपयोग करके मैप किए जाते हैं। मेरे साथ सब ठीक है। हालांकि, मैं उन शब्दकोशों की सामग्री में पुनरावृत्ति परिवर्तन करना चाहता हूं। समस्या यह है कि ऐसा करने से वे संदर्भित वस्तुओं को बदल देंगे --- और copy.copy() का उपयोग करना अच्छा नहीं है क्योंकि यह केवल शब्दकोश के भीतर निहित संदर्भों की प्रतिलिपि बनाता है। इस प्रकार, अगर मैंने कुछ कॉपी किया है, तो जब मैं कोशिश करता हूं, तो print
शब्दकोष की सामग्री कहें, मुझे केवल ऑब्जेक्ट के लिए नवीनतम अपडेट किए गए मान मिलेंगे।
यही कारण है कि मैं copy.deepcopy() का उपयोग करना चाहता था लेकिन यह SQLAlchemy के साथ काम नहीं करता है। अब मैं एक दुविधा में हूं क्योंकि मुझे पुनरावृत्ति परिवर्तन करने से पहले अपने ऑब्जेक्ट के कुछ विशेषताओं की प्रतिलिपि बनाने की आवश्यकता है।
सारांश में, मैं एक ही समय में SQLAlchemy और उपयोग करने के लिए जब परिवर्तन करने मैं अपने वस्तु की एक प्रति हो सकता है यकीन है कि जिम्मेदार बताते हैं बनाने के तो मैं संदर्भित वस्तु ही बदल नहीं है की जरूरत है।
कोई सलाह, सहायता, सुझाव इत्यादि?
Edit:
कुछ कोड जोड़ा है।
class Student(object):
def __init__(self, sid, name, allocated_proj_ref, allocated_rank):
self.sid = sid
self.name = name
self.allocated_proj_ref = None
self.allocated_rank = None
students_table = Table('studs', metadata,
Column('sid', Integer, primary_key=True),
Column('name', String),
Column('allocated_proj_ref', Integer, ForeignKey('projs.proj_id')),
Column('allocated_rank', Integer)
)
mapper(Student, students_table, properties={'proj' : relation(Project)})
students = {}
students[sid] = Student(sid, name, allocated_project, allocated_rank)
इस प्रकार, गुण है कि मैं बदलने वाला है allocated_proj_ref
और allocated_rank
विशेषताएँ हैं। students_table
अद्वितीय छात्र आईडी (sid
) का उपयोग करके कुंजी है।
Question
मैं गुण मैं ऊपर बदल बनाए रखना चाहते हैं - मेरा मतलब है, कि मूल रूप से कारण है कि मैं SQLA उपयोग करने का फैसला है। हालांकि, मैप किए गए ऑब्जेक्ट को बदल दिया जाएगा, जिसकी अनुशंसा नहीं की जाती है। इस प्रकार, यदि मैं doppelgänger में परिवर्तन करता हूं, ऑब्जेक्ट को अनैप्ड किया गया ... क्या मैं उन परिवर्तनों को ले सकता हूं और मैप ऑब्जेक्ट के लिए फ़ील्ड/तालिका अपडेट कर सकता हूं।
एक अर्थ में मैं डेविड के secondary solution का अनुसरण कर रहा हूं जहां मैं कक्षा का एक और संस्करण बना रहा हूं जो मैप नहीं किया गया है।
मैं StudentDBRecord
समाधान नीचे उल्लेख उपयोग करने की कोशिश लेकिन एक त्रुटि मिल गया है!
File "Main.py", line 25, in <module>
prefsTableFile = 'Database/prefs-table.txt')
File "/XXXX/DataReader.py", line 158, in readData
readProjectsFile(projectsFile)
File "/XXXX/DataReader.py", line 66, in readProjectsFile
supervisors[ee_id] = Supervisor(ee_id, name, original_quota, loading_limit)
File "<string>", line 4, in __init__
raise exc.UnmappedClassError(class_)
sqlalchemy.orm.exc.UnmappedClassError: Class 'ProjectParties.Student' is not mapped
इसका मतलब यह है कि Student
मैप किया जाना चाहिए?
Health warning!
किसी ने यहाँ एक बहुत अच्छी अतिरिक्त मुद्दा बताया। देखें, भले ही मैं copy.deepcopy()
को गैर-मैप किए गए ऑब्जेक्ट पर कॉल कर रहा हूं, इस मामले में, मान लीजिए कि यह ऊपर वर्णित छात्रों के शब्दकोश है, गहरी प्रतिलिपि की प्रतिलिपि बनाता है।मेरे allocated_proj_ref
वास्तव में एक Project
वस्तु है, और मुझे लगता है कि के लिए एक इसी projects
शब्दकोश मिल गया है।
तो मैं students
और projects
दोनों deepcopy - जो मैं कर रहा हूँ - वे कहते हैं मैं मामलों होगा जहां students
के allocated_proj_ref
विशेषता projects
शब्दकोश में उदाहरणों के साथ मिलान के साथ मुद्दों होगा।
इस प्रकार, मैं इसे ले कि मैं फिर से परिभाषित करने/ओवरराइड (है कि यह क्या कहते हैं यह है ना?) def __deecopy__(self, memo):
या ऐसा ही कुछ का उपयोग कर प्रत्येक कक्षा में deepcopy
होगा?
मैं मैं ओवरराइड यह सब SQLA सामान (जो <class 'sqlalchemy.util.symbol'>
और <class 'sqlalchemy.orm.state.InstanceState'>
हैं), लेकिन सब कुछ है कि एक मैप किया वर्ग का हिस्सा है नकल पर ध्यान नहीं देता __deepcopy__
ऐसी है कि करना चाहते हैं चाहते हैं।
कोई सुझाव, कृपया?
जब आप मैप किए गए वस्तुओं को संशोधित, आप मूल या परिवर्तित संस्करणों चाहते हो कायम किया जाना है: यहाँ अवधारणा कोड नमूने की साबित होता है? –
@ विंस्टन: या तो मूल बने रहें या एक विशिष्ट परिवर्तित संस्करण ('सर्वश्रेष्ठ' - संपादन देखें) बने रहें। मैं पहले से ही बाद में समस्याओं को देख सकता हूं क्योंकि 'सर्वश्रेष्ठ' अभी भी नहीं रह रहा है क्योंकि मैं ऑब्जेक्ट को अपडेट कर रहा हूं। आह। – PizzAzzra
आपके संपादन के जवाब में: ऐसा करने के लिए आप डेटाबेस का उपयोग क्यों कर रहे हैं? यह नियमित रूप से पाइथन कक्षा के रूप में 'छात्र' रखने के लिए बहुत अधिक समझदारी करेगा, और इसे केवल डेटाबेस के बाद (या फ़ाइल) में स्टोर करेगा _after_ आपको वैश्विक इष्टतम मिल जाएगा। –