2015-09-26 6 views
5

के साथ डेटाबेस माइग्रेट या अपग्रेड नहीं कर सकता मैं अपने डेटाबेस को अपडेट करने के लिए Flask-Migrate (Alembic) का उपयोग कर रहा हूं। मैंने अपनी models.py फ़ाइल अपडेट की है हालांकि मैंने एक त्रुटि की है। मैं एक प्रवास भाग गया और डेटाबेस के उन्नयन के लिए चला गया, लेकिन मैं यह त्रुटि आई:Flask-Migrate (Alembic)

sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1215, 'Cannot add foreign key constraint') [SQL: u'\nCREATE TABLE topics (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\t`subjectID` INTEGER, \n\ttopic VARCHAR(150) NOT NULL, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(`subjectID`) REFERENCES subjects (id)\n)\n\n'] 

मैंने क्या किया था एक विदेशी कुंजी के लिए db.Text बजाय db.Integer है।

alembic.util.CommandError: Target database is not up to date. 

तो अब मैं अटक कर रहा हूँ:

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

python manage.py db downgrade --sql b877018671c:36949b1cca31 

लेकिन जब मैं python manage.py db current चलाने मैं नवीनतम डेटाबेस संस्करण है जो मैं में फंस कर रहा हूँ मिल

वहाँ इस के लिए एक ठीक है।? धन्यवाद।

+0

ऐसा लगता है कि आपके पास माइग्रेशन (खराब एक) है जिसे आपने अभी तक नहीं चलाया है। या तो इसे सही या संपादित करने के लिए संपादित करें और फिर माइग्रेशन उत्पन्न करें। – dirn

+0

मैं माइग्रेशन कैसे हटा सकता हूं? –

+0

माइग्रेशन सिर्फ फाइलें हैं। आपको बस फाइल को हटाना होगा। फ्लास्क-माइग्रेट आम तौर पर उन्हें 'माइग्रेशन/वर्जन' के अंदर स्टोर करता है। – dirn

उत्तर

10

अलेम्बिक एक तालिका में डीबी संस्करण स्टोर करता है जिसे इसे alembic_version कहा जाता है। इस तालिका में एक फ़ील्ड और पंक्ति alembic_version.version_num है। सुनिश्चित करें कि इसके लिए मान migrations/version में सबसे हाल की फ़ाइल के फ़ाइल नाम से मेल खाता है। यह संस्करण संख्या revision चर में संशोधन फ़ाइल के अंदर भी निहित है जो आमतौर पर फ़ाइल की पंक्ति 26 पर दिखाई देती है। सुनिश्चित करें कि यह डीबी संस्करण से मेल खाता है।

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

+0

मेरे पास एक ही समस्या थी, और आपका समाधान काम करता था, लेकिन मैं हूं एक मामले पर उलझन में। असल में, मैं गलती से एक ही माइग्रेट कमांड को दो बार चलाता हूं, इसलिए मेरे माइग्रेशन/संस्करण फ़ोल्डर में, दो समान माइग्रेशन बनाए गए थे, पहला वास्तव में मेरे मॉडल पर हुए बदलावों को प्रतिबिंबित करता है, दूसरा दूसरा खाली था। क्या आपको लगता है कि इस वजह से मुझे यह समस्या मिली है? क्योंकि जब मैंने alembic_version की जांच की, तो पहले माइग्रेशन से मेल खाता था लेकिन दूसरा – Humoyun

+0

नहीं, इससे कोई समस्या नहीं होनी चाहिए, क्योंकि यदि आप दूसरी माइग्रेशन स्क्रिप्ट खोलते हैं तो आप देखेंगे कि यह वास्तव में कुछ भी नहीं करता है। यदि आप ओसीडी (मेरे जैसे) हैं, तो आप दूसरी माइग्रेशन फ़ाइल को हटा सकते हैं जिसकी आवश्यकता नहीं है। बस सुनिश्चित करें कि 'alembic_version.version_num' का मान पहली (सही) माइग्रेशन स्क्रिप्ट के फ़ाइल नाम से मेल खाता है। –

4

मुझे लगता है कि स्वीकृत उत्तर थोड़ा अधिक जटिल है। मेरे पास यह वही मुद्दा था और जिस तरीके से मैंने इसे हल किया था, वह केवल उस माइग्रेशन को हटाना था जिसमें कोडिंग त्रुटियां थीं। तब से आपको इसकी आवश्यकता नहीं है, फिर से, इसे गलत तरीके से कोड किया गया था। migrations/versions फ़ोल्डर में नवीनतम माइग्रेशन पाएं, इसे हटाएं, फिर अपना माइग्रेशन फिर से चलाएं और अपग्रेड करें। इसे माइग्रेट करने के लिए आपको अपने डेटाबेस में डेटा को हटाने की आवश्यकता नहीं है।

+0

बिल्कुल मैंने क्या किया :) – danidee

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