कैसे Django 1.7 में पलायन को आसान बनाने के लिए?


92

दक्षिण के लिए पहले से ही समान प्रश्न हैं, लेकिन मैंने अपना प्रोजेक्ट Django 1.7 के साथ शुरू किया है और मैं दक्षिण का उपयोग नहीं कर रहा हूं।

विकास के दौरान बहुत सारे माइग्रेशन बनाए गए हैं, हालांकि सॉफ्टवेयर अभी तक वितरित नहीं हुआ है और कोई डेटाबेस मौजूद नहीं है जिसे माइग्रेट किया जाना चाहिए। इसलिए मैं माइग्रेशन को रीसेट करना चाहूंगा जैसे कि मेरा वर्तमान मॉडल मूल एक था और सभी डेटाबेस को फिर से बनाना था।

ऐसा करने का अनुशंसित तरीका क्या है?

EDIT: Django 1.8 के रूप में स्क्वैशमग्रेशन नाम का एक नया कमांड है जो कमोबेश यहां वर्णित समस्या को हल करता है।


माइग्रेशन रीसेट करने का क्या मतलब है? पिछे वापस जाना?
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '

जवाबों:


137

मुझे यह मिल गया। मैंने अभी यह पता लगाया है और यह अच्छा है।

  • माइग्रेशन तालिका साफ़ करने के लिए सबसे पहले:

    ./manage.py migrate --fake <app-name> zero
  • app-name/migrations/फ़ोल्डर या सामग्री निकालें ।

  • पलायन करें:

    ./manage.py makemigrations <app-name>
  • अंत में अन्य डेटाबेस परिवर्तन किए बिना अपने माइग्रेशन को साफ करें:

    ./manage.py migrate --fake <app-name>

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

15
यदि आप थोड़ा विस्तृत करते हैं, तो यह स्वीकृत उत्तर होना चाहिए।
तानी-रोक्क

8
महान एक पंक्ति उत्तर भाई, मुझे नहीं पता कि यह क्या करता है
bischoffingston

13
यह रेखा बस एक-एक करके माइग्रेशन को उलटती है, जब तक zero। Django माइग्रेशन सिस्टम के लिए, <app-name> अब एक नया ऐप है और makemigrations <app-name>इससे शुरू होगा 0001--fakeतालिकाओं को वास्तव में संशोधित होने से रोकता है, कि माइग्रेशन को केवल उल्टा चिह्नित किया जाना चाहिए और वास्तव में स्कीमा पर लागू नहीं किया जाना चाहिए। (पूर्णता की खातिर छोटी-छोटी व्याख्याएँ जोड़ते हुए, @ tani-rokk, @Fabrizio)
मीर नाजिम

17
manage.py migrate --fake <app-name> zeroमाइग्रेशन तालिका साफ़ करने के लिए, फिर <app-name> / migrations / folder या content को हटा दें। तब manage.py makemigrations <app-name>और अंत में करते हैं manage.py migrate --fake <app-name>। यह अन्य डेटाबेस परिवर्तन किए बिना आपके माइग्रेशन को सुव्यवस्थित करेगा।
डोके

36

Django 1.7 माइग्रेशन के संस्करण में रीसेट कार्यक्षमता जो दक्षिण में हुआ करती थी, उसे आपके माइग्रेशन 'स्क्वैश' के लिए नई कार्यक्षमता के पक्ष में छोड़ दिया गया है। प्रवासियों की संख्या को नियंत्रण में रखने के लिए यह एक अच्छा तरीका माना जाता है।

https://docs.djangoproject.com/en/dev/topics/migrations/#squashing-migrations

यदि आप अभी भी वास्तव में खरोंच से शुरू करना चाहते हैं, तो मुझे लगता है कि आप अभी भी माइग्रेशन टेबल को खाली कर सकते हैं और माइग्रेशन को हटा सकते हैं जिसके बाद आप makemigrationsफिर से दौड़ेंगे ।


2
मैं माइग्रेशन तालिका खाली करने के अलावा "माइग्रेशन कैसे निकालूंगा"? क्या मैं संपूर्ण फ़ोल्डर या सिर्फ 00X _ * py फ़ाइलों को हटा दूंगा?
किट फिस्टो

दक्षिण के साथ आप उन माइग्रेशन फ़ोल्डर को हटा सकते हैं, जब आप दोबारा मेमेनिग्रेशन चलाते हैं। मुझे लगता है कि यह Django 1.7 के लिए एक ही काम करता है
9

4
सिर्फ एक नोट। Django 1.7 में, यदि आप ध्यान से नहीं, माइग्रेशन फ़ोल्डर को हटा दें तो यह अपवाद हो सकता है यदि आपका मॉडल दूसरे का बच्चा हैraise KeyError("Migration %s dependencies reference nonexistent parent node %r" % (migration, parent))
एल्गोरिथममैटिक

विशेष रूप ./manage.py squashmigrations myapp 0004से 0004आपके एप्लिकेशन में माइग्रेशन से पहले सभी माइग्रेशन स्क्वैश करेगा myapp। यह एकल स्क्वैश माइग्रेशन बनाएगा।
ब्रायस गुइंटा

22

मुझे बस यही समस्या थी। यहाँ मेरा काम है।

#!/bin/sh
echo "Starting ..."

echo ">> Deleting old migrations"
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete


# Optional
echo ">> Deleting database"
find . -name "db.sqlite3" -delete

echo ">> Running manage.py makemigrations"
python manage.py makemigrations

echo ">> Running manage.py migrate"
python manage.py migrate

echo ">> Done"

findआदेश: http://unixhelp.ed.ac.uk/CGI/man-cgi?find


13
यह डेटा को हटाता है, न कि केवल पलायन
hob

2
आपको .pyc फ़ाइलें भी हटा देनी चाहिए
shalbafzadeh

7

यह मानते हुए कि यह आपकी परियोजना संरचना है,

project_root/
    app1/
        migrations/
    app2/
        migrations/
    ...
    manage.py
    remove_migrations.py

आप सभी माइग्रेशन फ़ाइलों को हटाने के लिए ऊपर बताए गए स्थान से स्क्रिप्ट remove_migrations.py चला सकते हैं।

#remove_migrations.py
"""
Run this file from a Django =1.7 project root. 
Removes all migration files from all apps in a project.
""" 
from unipath import Path

this_file = Path(__file__).absolute()
current_dir = this_file.parent
dir_list = current_dir.listdir()

for paths in dir_list:
    migration_folder = paths.child('migrations')
    if migration_folder.exists():
        list_files = migration_folder.listdir()
        for files in list_files:
            split = files.components()
            if split[-1] != Path('__init__.py'):
                files.remove()

यदि आपके पास एक विस्तृत परियोजना है तो मैन्युअल रूप से हटाना थकाऊ हो सकता है। इससे मेरा काफी समय बच गया। माइग्रेशन फ़ाइलों को हटाना सुरक्षित है। मैंने इसे बिना किसी समस्या का सामना किए कई बार किया है।

हालाँकि जब मैंने माइग्रेशन फ़ोल्डर को हटा दिया, makemigrationsया migrateमेरे लिए फ़ोल्डर वापस नहीं बनाया। स्क्रिप्ट यह सुनिश्चित करती है कि माइग्रेशन फ़ोल्डर अपने __init__.pyस्टे के साथ , केवल माइग्रेशन फ़ाइलों को हटा रहा है।


आप बस माइग्रेशन फ़ोल्डरों को हटा सकते हैं और उन्हें खाली init .py (जैसे) के साथ फिर से बना सकते हैंtouch migrations/__init__.py )
hobs

6
  1. फ़ाइलें हटाएँ: delete_migrations.py (prj की जड़ में):
import os

for root, dirs, files in os.walk(".", topdown=False):
  for name in files:
      if '/migrations' in root and name != '__init__.py':
          os.remove(os.path.join(root, name))
  1. DELETE FROM django_migrations Where app in ('app1', 'app2');

  2. ./manage.py makemigrations

  3. ./manage.py माइग्रेट --fake

या, आप इस सब से माइग्रेशन लिख सकते हैं


मुझे ./manage.py makemigrationsकाम करने के लिए ऐप के नाम निर्दिष्ट करने थे, जैसे:./manage.py makemigrations orders alerts
सलामी

4

मैं विभिन्न आदेशों की कोशिश करता हूं और कुछ उत्तर मेरी मदद करते हैं। केवल मेरे मामले में इस क्रम ने MYAPP में माइग्रेशन में दोनों टूटी हुई निर्भरता को ठीक किया और खरोंच से शुरू होने वाले सभी पिछले माइग्रेशन को साफ किया।

ऐसा करने से पहले यह सुनिश्चित करें कि डेटाबेस पहले से ही सिंक किया हुआ है (जैसे कि यहां कोई नया मॉडल फ़ील्ड न जोड़ें या मेटा विकल्प बदलें)।

rm -Rf MYAPP/migrations/*
python manage.py makemigrations --empty MYAPP
python manage.py makemigrations
python manage.py migrate --fake MYAPP 0002

जहां 0002 अंतिम makemigrations कमांड द्वारा दिया गया माइग्रेशन नंबर है।

अब आप makemigrations चला सकते हैं / फिर से सामान्य रूप से माइग्रेट कर सकते हैं क्योंकि माइग्रेशन 0002 संग्रहीत है लेकिन पहले से-सिंक किए गए डेटाबेस में परिलक्षित नहीं होता है।


ऊपर उल्लिखित सभी समाधानों में से, केवल इसने मेरे लिए एक गड़बड़ के बिना और डेटाबेस को हटाए बिना काम किया।
विवेक झा

3

यदि आपको पिछले माइग्रेशन की परवाह नहीं है, तो माइग्रेशन / डायरेक्टरी में सभी माइग्रेशन को हटाने के बारे में क्या है? आप अपने वर्तमान मॉडल को संदर्भ के रूप में लेते हुए खरोंच से माइग्रेशन अनुक्रम शुरू करेंगे, जैसे कि आपने अभी पूरा मॉडल लिखा है।

यदि आप मुझे हटाने के लिए पर्याप्त विश्वास नहीं करते हैं, तो उन्हें दूर स्थानांतरित करने का प्रयास करें।


पुराने प्रवासों को रखने का क्या महत्व है? जब कोई django 1.6 से 1.8 में अपग्रेड करने की कोशिश करता है, तो मेरे सवालों पर जोर पड़ता है।
जय मोदी

माइग्रेशन केवल डेटाबेस में आपके द्वारा किए गए परिवर्तनों का एक ट्रैक रिकॉर्ड है। जब मेरी माइग्रेशन चेन काम करना बंद कर देती है तो मैंने एक से अधिक बार वोकिमन की सलाह ली है।
एडम स्टार्र

1

एक सरल तरीका है

हर ऐप पर जाएं और माइग्रेशन फ़ाइलों को हटाएं।

फिर डेटाबेस में django-migrtaions टेबल पर जाएं और इसे काट दें (सभी प्रविष्टियों को हटा दें)।

उसके बाद आप एक बार फिर से माइग्रेशन बना सकते हैं।


1
माइग्रेशन फ़ाइलों को हटाते समय, सुनिश्चित करें कि आप इनिट फ़ाइलों को हटाएं नहीं ।
स्प्रेक्ष

इसने वास्तव में मेरी मदद की। मैंने सभी माइग्रेशन हटा दिए, मेरे साइक्लाइट डीबी से तालिकाओं को हटा दिया, लेकिन अभी भी उपलब्धियां करने में असमर्थ था ... हालांकि, एक बार जब मैंने _init_ .py फ़ाइलों (doh) को पुनर्स्थापित कर लिया तो मैं फिर से उपलब्धियां प्राप्त करने और मंडरा रहा था। @ श्रीप्रकाश = लाइफसेवर!
ट्विनकब

0

सीडी से src निर्देशिका cd /path/to/src

माइग्रेशन निर्देशिकाओं को हटाएं rm -rf your_app/migrations/

ध्यान दें कि यह प्रत्येक ऐप के लिए अलग से किया जाना चाहिए

विस्थापित python3.3 manage.py migrate

यदि आप फिर से शुरू करना चाहते हैं python3.3 manage.py makemigrations your_app


0

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

#!/usr/bin/env bash
echo "This will wipe out the database, delete migration files, make and apply migrations and load the intial fixtures."

while true; do
    read -p "Do you wish to continue?" yn
    case $yn in
        [Yy]* ) make install; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer yes or no.";;
    esac
done

echo ">> Deleting old migrations"
find ../../src -path "*/migrations/*.py" -not -name "__init__.py" -delete

# Optional
echo ">> Deleting database"
psql -U db_user -d db_name -a -f ./reset-db.sql

echo ">> Running manage.py makemigrations and migrate"
./migrations.sh

echo ">> Loading initial fixtures"
./load_initial_fixtures.sh

echo ">> Done"

रीसेट-db.sql फ़ाइल:

DO $$ DECLARE
    r RECORD;
BEGIN
    -- if the schema you operate on is not "current", you will want to
    -- replace current_schema() in query with 'schematodeletetablesfrom'
    -- *and* update the generate 'DROP...' accordingly.
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
        EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
    END LOOP;
END $$;

प्रवास.श फ़ाइल:

#!/usr/bin/env bash
cd ../../src
./manage.py makemigrations
./manage.py migrate

load_initial_fixtures.sh फ़ाइल:

#!/usr/bin/env bash
cd ../../src
./manage.py loaddata ~/path-to-fixture/fixture.json

बस अपने ऐप से मेल खाते रास्तों को बदलना सुनिश्चित करें। मेरे पास निजी रूप से Project_root / script / local नामक फ़ोल्डर में ये स्क्रिप्ट्स हैं, और django के स्रोत project_root / src में हैं।


0

अपने ऐप (मैन्युअल रूप से) में प्रत्येक "माइग्रेशन" फ़ोल्डर को हटाने के बाद, मैं भाग गया:

./manage.py dbshell
delete from django_migrations;

तब मुझे लगा कि मैं ./manage.py makemigrationsउन सभी को फिर से जीवित करने के लिए कर सकता हूं । हालांकि, कोई बदलाव नहीं पाया गया। मैं तो एक समय में एक एप्लिकेशन को निर्दिष्ट करने की कोशिश की: ./manage.py makemigrations foo,./manage.py makemigrations bar । हालाँकि, इसके परिणामस्वरूप परिपत्र निर्भरताएँ हल नहीं हो सकीं।

अंत में, मैंने एक एकल makemigrations कमांड चलाया, जिसमें मेरे सभी ऐप्स (किसी विशेष क्रम में) निर्दिष्ट नहीं किए गए थे:

./manage.py makemigrations foo bar bike orange banana etc

इस बार, इसने काम किया - परिपत्र निर्भरताएं स्वचालित रूप से हल हो गईं (इसने अतिरिक्त माइग्रेशन फ़ाइलों को आवश्यक बनाया)।

तब मैं दौड़ने में सक्षम था ./manage.py migrate --fakeऔर व्यवसाय में वापस आ गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.