2014-10-02 9 views
11

में एक एपेंड-केवल संस्करण मॉडल को कार्यान्वित करने के लिए कैसे मैं अपने कुछ मौजूदा एसक्लाक्लेमी मॉडल को एक संलग्न-केवल डेटास्टोर में दोबारा कार्यान्वित करना चाहता हूं; केवल ऐप का अर्थ है कि ऑब्जेक्ट केवल INSERT कथन के साथ अपडेट किया गया है, अद्यतन या DELETE कथन का उपयोग नहीं कर रहा है।एसक्यूएलकेमी

अपडेट और डिलीट स्टेटमेंट को एक और आईएनएसईआरटी के साथ बदल दिया जाएगा जो संस्करण को बढ़ाता है। एक is_deleted झंडा वहाँ हो सकता है और हटाने की बजाय होगा, is_deleted=True के साथ एक नया संस्करण बनाया जाएगा:

id | version | is_deleted | name  | description ... 
---- --------- ------------ ----------- --------------- 
    1 |  1 |   F | Fo  | Text text text. 
    1 |  2 |   F | Foo  | Text text text. 
    2 |  1 |   F | Bar  | null 
    1 |  3 |   T | Foo  | Text text text.   

साथ ही,

  • सभी SELECT स्टेटमेंट्स के लिए केवल अधिकतम संस्करण संख्या को फिर से लिखा करने की आवश्यकता होगी प्रत्येक आईडी, जैसा कि इस प्रश्न में वर्णित है: PostgreSQL - fetch the row which has the Max value for a column
  • सभी (अद्वितीय) अनुक्रमणिका को "आईडी" प्राथमिक कुंजी द्वारा अद्वितीय होने के लिए फिर से लिखना होगा, क्योंकि प्रत्येक आईडी एक से अधिक बार उपस्थित हो सकती है।

मैं इन मुद्दों का सबसे हल करने के लिए कैसे पता है, लेकिन मैं SQLAlchemy में घटना हुक कि कुछ चीजें अद्यतन पर किया जाना & हटाना होगा कि संभाल हैं के साथ संघर्ष कर रहा हूँ।

एसक्यूएलकेमी दस्तावेज में पहले से ही संस्करण के लिए कुछ बुनियादी उदाहरण हैं। versioned rows उदाहरण जो मैं चाहता हूं उसके करीब आता है, लेकिन वे (1) हटाने और (2) विदेशी कुंजी संबंधों को संभाल नहीं पाते हैं।

(1) हटाना। मुझे पता है कि session.deleted फ़ील्ड है, और मैं session.dirty को versioned_rows.py उदाहरण में फिर से चालू कर रहा हूं, इस तरह से इसे फिर से चालू कर दूंगा- लेकिन मैं आइटम को हटाए जाने वाले सूची & से एक नया आइटम कैसे बनाऊं?

(2) उपर्युक्त उदाहरण केवल माता-पिता के संबंधों से संबंधित है, और जिस तरह से यह करता है (रिश्ते की समाप्ति) प्रत्येक मॉडल के लिए कस्टम कोड की आवश्यकता होती है। (2.1) क्या यह और अधिक लचीला बनाने का कोई तरीका है? (2.2) किसी दिए गए विदेशी कुंजी के लिए ऑब्जेक्ट को अधिकतम (संस्करण) के साथ वापस करने के लिए SQLAlchemy के relationship() को कॉन्फ़िगर करना संभव है?

+1

जो शब्द आप खोज रहे हैं वह "सॉफ्ट-डिलीट" है। मैं वास्तव में SQLAlchemy नहीं जानता, लेकिन शायद यह आपकी मदद करेगा। व्यक्तिगत रूप से मैं शायद डेटाबेस पक्ष पर ट्रिगर के साथ ऐसा करूँगा। –

+0

धन्यवाद - मुझे यह मुलायम हटाने पर मिला, जो मेरे प्रश्न के पहले भाग में मदद करता है http://stackoverflow.com/questions/23198801/sqlalchemy-using-aliased-in-query-with-custom-primaryjoin-relationship डेटाबेस का उपयोग करना ट्रिगर्स मेरे लिए एक विकल्प नहीं है क्योंकि मेरा मॉडल अक्सर बदलता है और ट्रिगर्स को एलेम्बिक जैसे माइग्रेशन टूल द्वारा अच्छी तरह से संभाला नहीं जाता है। – lyschoening

+1

उत्सुक सवाल, मैं इसे संभालने के कुछ उदाहरण भी देखना पसंद करूंगा। अधिकतम (संस्करण) से जोड़ने के संबंध में बेहतर तरीका शायद हेड संस्करण के खिलाफ संस्करण संख्या नहीं है, ताकि आप सीधे नवीनतम रिकॉर्ड (संस्करण == कोई नहीं) में शामिल हो सकें। क्या डेटा एक ही टेबल में होना चाहिए? बस सोच रहा है कि क्या संस्करण ऑब्जेक्ट सिस्टम (जो दूसरी तालिका बनाता है, blah_history) चीजों को सरल बना सकता है http://docs.sqlalchemy.org/en/latest/orm/examples.html#versioning-objects। यह हटा देता है कि पूरे संस्करण इतिहास द्वितीयक तालिका में उपलब्ध है। –

उत्तर

1

एक सहायक चीज जो ओआरएम उपकरण अज्ञेयवादी होगा "ट्रिगर्स" के बजाय हो सकता है। उदाहरण के लिए, आप पहले अपडेट किए गए ईवेंट को पकड़ सकते हैं, और नए अपडेट किए गए डेटा के साथ एक वर्जन नंबर बढ़ा सकते हैं।

पोस्टग्रेस्क्ल के लिए वे here विस्तृत हैं।

बेशक, आपको मॉडल में बदलाव करना होगा (पीके पर, आदि)।

इसके अलावा, प्रदर्शन प्रभावों का अध्ययन करने के लायक होंगे, क्योंकि आपको "नवीनतम संस्करण" लाने के लिए एक रिकर्सिव क्वेरी होना होगा (या तो दृश्य परत के माध्यम से, या एसक्यूएल कीमिया में जहां खंड/आदि।)

0

जैसा कि पागल हो सकता है, यह आपके लिए अच्छा हो सकता है, वास्तव में यह एक अलग प्रकार के डेटाबेस का उपयोग करने के लिए बेहतर हो सकता है। क्या आप Datomic? से अवगत हैं। पारंपरिक आरडीबीएमएस और इस प्रकार के सिस्टम के बीच मौलिक मतभेदों में से एक यह है कि कोई अपडेट-इन-प्लेस नहीं है, इस प्रकार एक आरडीबीएमएस डिस्क पर फ़ाइलों को अपडेट करता है। इसके बजाए, सब कुछ संस्करणित है, और आप डेटाबेस के सभी पिछले संस्करणों के माध्यम से हर एक संसाधन में प्रत्येक बदलाव के लिए वापस जा सकते हैं। इसके अतिरिक्त, आप पैरामीटर के रूप में ब्याज के समय को पार करके, समय पर किसी विशेष पल में पूरे डेटाबेस की स्थिति को आसानी से देख सकते हैं।कई अन्य दिलचस्प फायदे हैं, और मैं अत्यधिक रिच हिकी की वार्ता पर कुछ नज़र डालने की सलाह देता हूं, उदाहरण के लिए this one। वर्तमान में आप जो प्रयास कर रहे हैं, उसके लिए यह निश्चित रूप से एक मूलभूत दृष्टिकोण है, लेकिन किसी को इस बात पर विचार करना होगा कि इस प्रयास का उपयोग करके प्रत्येक चरण में उपकरण के खिलाफ लड़कर उस प्रयास को डॉग किया जा रहा है कि वे वास्तव में नहीं थे डिजाइन (आरडीबीएमएस, ओआरएम, माइग्रेशन मैनेजर, ...)। इसके बजाए, आप उस जटिलता को एक परत के नीचे धक्का दे सकते हैं और एक अलग प्रकार के डीबी को आपके लिए संभाल सकते हैं।

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