में एक एपेंड-केवल संस्करण मॉडल को कार्यान्वित करने के लिए कैसे मैं अपने कुछ मौजूदा एसक्लाक्लेमी मॉडल को एक संलग्न-केवल डेटास्टोर में दोबारा कार्यान्वित करना चाहता हूं; केवल ऐप का अर्थ है कि ऑब्जेक्ट केवल 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()
को कॉन्फ़िगर करना संभव है?
जो शब्द आप खोज रहे हैं वह "सॉफ्ट-डिलीट" है। मैं वास्तव में SQLAlchemy नहीं जानता, लेकिन शायद यह आपकी मदद करेगा। व्यक्तिगत रूप से मैं शायद डेटाबेस पक्ष पर ट्रिगर के साथ ऐसा करूँगा। –
धन्यवाद - मुझे यह मुलायम हटाने पर मिला, जो मेरे प्रश्न के पहले भाग में मदद करता है http://stackoverflow.com/questions/23198801/sqlalchemy-using-aliased-in-query-with-custom-primaryjoin-relationship डेटाबेस का उपयोग करना ट्रिगर्स मेरे लिए एक विकल्प नहीं है क्योंकि मेरा मॉडल अक्सर बदलता है और ट्रिगर्स को एलेम्बिक जैसे माइग्रेशन टूल द्वारा अच्छी तरह से संभाला नहीं जाता है। – lyschoening
उत्सुक सवाल, मैं इसे संभालने के कुछ उदाहरण भी देखना पसंद करूंगा। अधिकतम (संस्करण) से जोड़ने के संबंध में बेहतर तरीका शायद हेड संस्करण के खिलाफ संस्करण संख्या नहीं है, ताकि आप सीधे नवीनतम रिकॉर्ड (संस्करण == कोई नहीं) में शामिल हो सकें। क्या डेटा एक ही टेबल में होना चाहिए? बस सोच रहा है कि क्या संस्करण ऑब्जेक्ट सिस्टम (जो दूसरी तालिका बनाता है, blah_history) चीजों को सरल बना सकता है http://docs.sqlalchemy.org/en/latest/orm/examples.html#versioning-objects। यह हटा देता है कि पूरे संस्करण इतिहास द्वितीयक तालिका में उपलब्ध है। –