2010-04-16 23 views
10

के साथ एक स्क्लाइट डेटाबेस स्कीमा अद्यतन करें मैंने एक पायथन एप्लिकेशन बनाया है जो डेटा स्टोर करने के लिए elixir/sqlalchemy का उपयोग करता है। सॉफ़्टवेयर की दूसरी रिलीज के लिए तालिका और कॉलम जोड़ने/हटाने के लिए पिछले संस्करण में बनाए गए किसी भी फाइल की आवश्यकता होती है।sqlalchemy और elixir

मेरा प्रश्न है: मैं इसे कैसे प्राप्त कर सकता हूं? मुझे sqlalchemy-migrate के बारे में पता है, लेकिन मुझे कहना होगा कि मुझे यह भ्रमित लगता है। यह उल्लेख नहीं करता कि मौजूदा डेटा के साथ क्या होता है। इसके अलावा, स्क्लाइट reduced ALTER TABLE support है, तो अगर मैं कॉलम हटाने की कोशिश करता हूं तो माइग्रेट क्या करेगा? क्या माइग्रेट का उपयोग करने के लिए कोई और दृष्टिकोण है?

उत्तर

7

आप किस बारे में बात कर रहे हैं एक प्रसिद्ध और काफी जटिल समस्या है। इसे डेटाबेस माइग्रेशन के रूप में जाना जाता है। प्रत्येक अच्छी परियोजना में कुछ नीतियां होती हैं जो वर्णन करती हैं कि डेटाबेस स्कीमा और डेटा उत्परिवर्तन कैसे एक उत्पाद संस्करण से दूसरे उत्पाद पर अग्रिम रूप से लागू किए जाने चाहिए।

रेलवे पर Django या रूबी जैसे कई ढांचे में एक माइग्रेशन सिस्टम अंतर्निहित या प्लग-इन के रूप में उपलब्ध है। SQLAlchemy के साथ आपके मामले में कुछ विकल्प हैं:

  1. किसी भी सिस्टम का उपयोग न करें। बस /tmp/migrate.sql हाथों से लिखें, ALTER/DROP लिखें/कथन बनाएं, उंगलियों को पार करें और इसे अपने SQLite बेस पर लागू करें। यह आमतौर पर एक बुरा विचार है क्योंकि यह त्रुटि-प्रवण है, लेकिन पसंद आपके ऊपर है। पूर्ण-विशेषीकृत ALTER TABLE कथन की अनुपस्थिति अस्थायी नाम के साथ वांछित गुणों के साथ नया कॉलम बनाकर, मूल कॉलम से सभी डेटा कॉपी करने, मूल कॉलम को हटाने, और मूल नाम पर नए कॉलम का नाम बदलकर चारों ओर काम किया जा सकता है। टेबल-स्तर पर एक ही तकनीक का उपयोग किया जा सकता है।
  2. कुछ तृतीय-पक्ष माइग्रेशन सिस्टम जैसे liquibase का उपयोग करें। एक दोष को छोड़कर, लिक्विबेस शांत, अच्छी तरह डिज़ाइन और शक्तिशाली है। यह वास्तव में छोटी गाड़ी है। मैंने इसे SQLite के लिए कोशिश की (और सक्लाक्केमी के लिए हाँ, लेकिन यह वास्तव में कोई फर्क नहीं पड़ता), और यह कुछ सुंदर मूल बातें करने में विफल रहा। मैं एक समस्या के लिए googled और पाया कि वे बग ज्ञात हैं।
  3. आपके द्वारा उल्लेखित SQLAlchemy-माइग्रेट का उपयोग करें। यह आरओआर-माइग्रेशन के रूप में उतना शक्तिशाली नहीं है जितना इसे प्रेरित करता था, न ही यह तरल पदार्थ के रूप में शक्तिशाली है लेकिन यह काम करता है। SQLite सीमा उसी तरह से काम किया जा सकता है।

और आपने पूछा है कि यदि आप कॉलम हटाने का प्रयास करेंगे तो SQLAlchemy-migrate क्या करेगा। खैर, यह एक कॉलम हटा देगा और इसलिए इसमें मौजूद किसी भी डेटा को हटा दें। तालिका में अन्य कॉलम बरकरार रहेंगे।

0

आपको SQLlchemy-migrate में क्या भ्रमित करता है? इसमें पूर्वावलोकन करने के लिए --preview_sql और --preview_py विकल्प हैं जो यह करने जा रहा है। आम तौर पर किसी भी संभावित मामले के लिए सही माइग्रेशन करना असंभव है, लेकिन आप अपनी जरूरतों को पूरा करने के लिए जेनरेट माइग्रेशन स्क्रिप्ट को संशोधित कर सकते हैं। कोशिश करके बाकी के जवाब प्राप्त करना आसान है।

5

sqlalchemy-migrate का एक और हालिया विकल्प alembic है, जो स्वयं स्क्लेक्लेमी के लेखक द्वारा लिखे गए हैं। हालांकि उत्तरार्द्ध ("एक ही लेखक") एक मजबूत तर्क की तरह दिखता है, एक नकारात्मक पक्ष यह हो सकता है कि यह SQLite के साथ तालिका परिवर्तन का समर्थन नहीं करता है, यानी SQLite के अनुपलब्ध ALTER समर्थन के लिए इसमें कोई अंतर्निहित वर्कअराउंड नहीं है। (कोई तर्क दे सकता है कि यह दायरे से बाहर है और इसे एक विशेष पायथन पैकेज या SQLite एक्सटेंशन द्वारा हल किया जा सकता है।)