मेरा फ्लास्क-आरामपूर्ण एप्लिकेशन में कई "ऑब्जेक्ट्स" हैं। ऐप के पहले संस्करण में ये सरल डेटा स्ट्रक्चर हैं, जिनमें कोई व्यवहार नहीं है, डिक्ट्स के रूप में लागू किया गया है, या डिस्क्स की सूचियां हैं।गुणों की समानता के लिए SQLAlchemy ऑब्जेक्ट इंस्टेंस की तुलना
इन "ऑब्जेक्ट्स" के गुण बदल सकते हैं। मैं परिवर्तनों को ट्रैक करने के लिए जनरेटर फ़ंक्शन का उपयोग करता हूं, और फिर सर्वर-भेजे गए ईवेंट (एसएसई) के माध्यम से वेब-क्लाइंट को अलर्ट करता हूं। यह ऑब्जेक्ट की "पुरानी" प्रतिलिपि को ट्रैक करने और नवीनतम स्थिति की तुलना करने के द्वारा बनाए रखता है।
ऐप के अगले संस्करण में मैं एसक्यूएलकेमी का उपयोग कर SQLite डीबी से "ऑब्जेक्ट्स" को पॉप्युलेट करता हूं। ऑब्जेक्ट्स अब स्क्लाक्लेमी घोषणात्मक कक्षाओं, या ऐसी कक्षाओं की सूचियों के रूप में लागू किए गए हैं।
गुणों की समानता के आधार पर "पुराने" और "नए" उदाहरणों की तुलना करने के लिए मुझे केवल __eq__
पर मेरे SQLAlchemy ऑब्जेक्ट्स को ओवरराइड करना पड़ा। यानी जब गुणों के समान मान होते हैं तो उदाहरण बराबर/अपरिवर्तित माना जाता है। (मैंने इस प्रश्न के निचले हिस्से में उदाहरण कोड पोस्ट किया है)।
तकनीकी रूप से यह काम करता है, लेकिन कुछ वास्तुशिल्प अलार्म घंटी उठाता है: क्या मैं गलत दिशा में नौकायन कर रहा हूं?
क) मैं SQAlchemy वस्तुओं के लिए __eq__
और __ne__
ओवरराइड जोड़ते हैं, इस कारण एक समस्या SQLAlchemy सकता है जब मैं बाद में वस्तुओं वापस डेटाबेस के लिए फिर से लागू करने के लिए करना चाहते हैं?
बी) एसक्यूएलकेकी वस्तुओं तक पहुंचने के लिए मेरे आवेदन में कितना दूर है: क्या कोई "पायथनिक सर्वोत्तम अभ्यास" है? यानी एसबीएलएलकेमी ऑब्जेक्ट्स को विस्तारित करना सामान्य/सामान्य है जो व्यापार तर्क/व्यवहार के साथ डीबी दृढ़ता से जुड़े हुए हैं (जैसे परिवर्तनों को ट्रैक करना); या उन्हें अन्य वस्तुओं में व्यावसायिक तर्क के साथ डेटाबेस और सर्वर के बीच केवल साधारण डीटीओ के रूप में उपयोग किया जाना चाहिए?
नोट: यह मुझे स्पष्ट है कि आरईएसटी एपिस और एसएसई के माध्यम से ग्राहकों को प्रस्तुत डेटा वेब सर्वर और डीबी में कार्यान्वयन विवरण से समझा जाना चाहिए, ताकि यह इस प्रश्न का हिस्सा न हो।
sqlalchemy id equality vs reference equality https://codereview.stackexchange.com/questions/93511/data-transfer-objects-vs-entities-in-java-rest-server-application http://www.mehdi-khalili.com/orm-anti-patterns-part-4-persistence-domain-model/
class EqualityMixin(object):
# extended from the concept in :
# https://stackoverflow.com/questions/390250/elegant-ways-to-support-equivalence-equality-in-python-classes
def __eq__(self, other):
classes_match = isinstance(other, self.__class__)
a, b = deepcopy(self.__dict__), deepcopy(other.__dict__)
#compare based on equality our attributes, ignoring SQLAlchemy internal stuff
a.pop('_sa_instance_state', None)
b.pop('_sa_instance_state', None)
attrs_match = (a == b)
return classes_match and attrs_match
def __ne__(self, other):
return not self.__eq__(other)