জাজানো ১.7-এ মাইগ্রেশন কীভাবে সহজ করবেন?


92

দক্ষিণের জন্য ইতিমধ্যে একই রকম প্রশ্ন রয়েছে তবে আমি আমার প্রকল্পটি জাজানো 1.7 দিয়ে শুরু করেছি এবং দক্ষিণ ব্যবহার করছি না।

উন্নয়নের সময় প্রচুর মাইগ্রেশন তৈরি করা হয়েছে, তবে সফ্টওয়্যারটি এখনও বিতরণ করা হয়নি এবং এমন কোনও ডাটাবেস নেই যা মাইগ্রেশন করতে হবে। অতএব আমি স্থানান্তরগুলি পুনরায় সেট করতে চাই যেন আমার বর্তমান মডেলটি আসল এবং সমস্ত ডাটাবেস পুনরায় তৈরি করুন।

এটি করার প্রস্তাবিত উপায় কী?

সম্পাদনা: জাজানো ১.৮ অনুসারে স্কোয়াশমিগ্রেশন নামে একটি নতুন কমান্ড রয়েছে যা এখানে বর্ণিত সমস্যাটি কমবেশি সমাধান করে।


স্থানান্তর পুনরায় সেট করার অর্থ কী? এটিকে পূর্বাবস্থায় ফেরাবেন?
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

উত্তর:


137

আমি এটা বুজেছি. আমি ঠিক এটি বের করেছিলাম এবং এটি ভাল।

  • প্রথমে মাইগ্রেশন সারণী সাফ করার জন্য:

    ./manage.py migrate --fake <app-name> zero
    
  • app-name/migrations/ফোল্ডার বা সামগ্রীগুলি সরান ।

  • স্থানান্তর করুন:

    ./manage.py makemigrations <app-name>
    
  • অন্যান্য ডেটাবেস পরিবর্তন না করে অবশেষে আপনার স্থানান্তর পরিস্কার করুন:

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

4
এটি একটি ভাল উত্তর। কেবল মাইগ্রেশন মুছে ফেলা ত্রুটিযুক্ত মাইগ্রেশনগুলির কোনও ক্ষতি পূর্বাবস্থায় ফেরায় না। এটি আসলে স্লেটটি পরিষ্কার করে এবং আপনাকে আবার শুরু করতে দেয়।
দুর্বৃত্ত

15
আপনি যদি কিছুটা বিশদভাবে বর্ণনা করতে চান তবে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
তনি-রোক

8
দারুণ এক লাইনের উত্তর ভাই,
এগুলি

13
এই লাইনটি কেবল একের পর এক স্থানান্তরকে বিপরীত করে, যতক্ষণ না zero। জাজানো মাইগ্রেশন সিস্টেমের জন্য, <app-name> এখন একটি নতুন অ্যাপ্লিকেশন এবং এর makemigrations <app-name>থেকে শুরু হবে 0001--fakeটেবিলগুলি আসলে সংশোধন হতে বাধা দেয়, মাইগ্রেশনগুলি কেবল বিপরীত হিসাবে চিহ্নিত করা উচিত এবং স্কিমায় আসলে প্রয়োগ করা উচিত নয়। (সম্পূর্ণতার জন্য ছোট ব্যাখ্যাগুলি যোগ করা, @ টানি-রক, @ ফ্যাবরিজিও)
মীর নাজিম

17
manage.py migrate --fake <app-name> zeroমাইগ্রেশন সারণি সাফ করতে, তারপরে <app-name> / মাইগ্রেশন / ফোল্ডার বা সামগ্রীগুলি সরিয়ে ফেলুন। তারপরে manage.py makemigrations <app-name>এবং শেষ পর্যন্ত না manage.py migrate --fake <app-name>। এটি অন্যান্য ডাটাবেস পরিবর্তন না করে আপনার স্থানান্তর পরিস্কার করবে।
দোকে

36

মাইগ্রেশনের জ্যাঙ্গো ১. version সংস্করণে রিসেট কার্যকারিতা যা দক্ষিণে ব্যবহৃত হত তা আপনার মাইগ্রেশনকে 'স্কোয়াশ' করার জন্য নতুন কার্যকারিতার পক্ষে ফেলে দেওয়া হয়েছে। মাইগ্রেশনের সংখ্যাটি ধরে রাখার জন্য এটি একটি ভাল উপায় বলে মনে করা হচ্ছে।

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

আপনি যদি এখনও সত্যিই স্ক্র্যাচ থেকে শুরু করতে চান তবে আমি মাইগ্রেশন টেবিলটি খালি করে এবং মাইগ্রেশনগুলি সরিয়ে দিয়ে আপনি makemigrationsআবার চালাতে পারবেন তা ধরে নিই ।


4
আমি কীভাবে মাইগ্রেশন টেবিল খালি করা ছাড়া "মাইগ্রেশনগুলি সরিয়ে ফেলব"? আমি কি পুরো ফোল্ডারটি সরিয়ে ফেলব বা কেবল 00X _ *। পিআই ফাইলগুলি?
কিট ফিস্টো

দক্ষিণের সাহায্যে আপনি মাইগ্রেশন ফোল্ডারটি সরিয়ে ফেলতে পারবেন যা আপনি আবার মেকমিজারেশন চালানোর সময় পুনরায় তৈরি করা হবে। আমি ধরে নিই যে এটি
জাজানো

4
শুধু একটি নোট. জ্যাঙ্গো ১.7-এ, আপনি যদি সাবধানে না হন তবে মাইগ্রেশন ফোল্ডারটি মুছুন এটি আপনার ব্যতিক্রম বাড়িয়ে তুলতে পারে যদি আপনার মডেল অন্যের সন্তানের হয়raise KeyError("Migration %s dependencies reference nonexistent parent node %r" % (migration, parent))
অ্যালগোরিদ্যাটিক

বিশেষত আপনার অ্যাপ্লিকেশনটিতে ./manage.py squashmigrations myapp 0004স্থানান্তরিত হওয়ার আগে সমস্ত স্থানান্তরকে স্কোয়াশ করবে । এটি একক স্কোয়াশেড স্থানান্তর তৈরি করবে will 0004myapp
ব্রাইস গিন্টা

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
এটি ডেটা মুছে দেয়, কেবল স্থানান্তর নয়
হাবস

4
আপনার .pyc ফাইলগুলিও মুছে ফেলা উচিত
shalbafzadeh

7

ধরে নিচ্ছি এটি আপনার প্রকল্প কাঠামো,

project_root/
    app1/
        migrations/
    app2/
        migrations/
    ...
    manage.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. ফাইলগুলি মুছুন: মুছুন_ইগ্রাফিকেশন.পি (প্রিজমের মূল)
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 Makemigration

  3. ./manage.py মাইগ্রেশন - ফেক

অথবা, আপনি এগুলি থেকে মাইগ্রেশন লিখতে পারেন


কাজ করার জন্য আমাকে অ্যাপের নামগুলি উল্লেখ করতে হয়েছিল ./manage.py makemigrations, যেমন:./manage.py makemigrations orders alerts
সালামি

4

আমি বিভিন্ন কমান্ড চেষ্টা করি এবং কিছু উত্তর আমাকে সহায়তা করে। কেবলমাত্র আমার ক্ষেত্রে এই ক্রমটি এমওয়াইপিপিতে স্থানান্তরকরণের উভয় ভাঙা নির্ভরতা স্থির করে এবং স্ক্র্যাচ থেকে শুরু করে সমস্ত অতীত স্থানান্তর পরিষ্কার করে।

এটি করার আগে নিশ্চিত হয়ে নিন যে ডেটাবেস ইতিমধ্যে সিঙ্ক হয়েছে (যেমন এখানে কোনও নতুন মডেল ক্ষেত্র যুক্ত করবেন না বা মেটা বিকল্পগুলি পরিবর্তন করবেন না)।

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

যেখানে 0002 হ'ল মাইগ্রেশন নম্বরটি শেষ মেকমিগ্রেশন কমান্ড দ্বারা ফিরে আসে।

এখন আপনি মেকমিগ্রেশন চালাতে পারেন / আবার সাধারণভাবে মাইগ্রেট করতে পারেন কারণ মাইগ্রেশন 0002 সঞ্চিত রয়েছে তবে ইতিমধ্যে সিঙ্ক হওয়া ডাটাবেসে প্রতিফলিত হয় না।


উপরে উল্লিখিত সমস্ত সমাধানগুলির মধ্যে কেবল এটি আমার জন্য কোনও ত্রুটি ছাড়াই এবং ডাটাবেস মোছা ছাড়াই কাজ করেছিল।
বিবেক ঝা

3

আপনি যদি পূর্ববর্তী স্থানান্তর সম্পর্কে চিন্তা না করেন তবে মাইগ্রেশন / ডিরেক্টরিতে সমস্ত স্থানান্তরণ অপসারণ সম্পর্কে কী? আপনি আপনার বর্তমান মডেলটিকে রেফারেন্স হিসাবে গ্রহণ করে শুরু থেকে মাইগ্রেশন সিকোয়েন্স শুরু করবেন যেন আপনি এখন পুরো মডেলটি লিখেছেন।

আপনি যদি বিশ্বাস করেন না যে আমাকে সরিয়ে নেওয়ার কল্পনা করেছে, তবে তাদের পরিবর্তে এগুলি সরিয়ে নেওয়ার চেষ্টা করুন।


পুরানো স্থানান্তরিত রাখার তাৎপর্য কী? যখন কেউ জাজানো 1.6 থেকে 1.8 এ আপগ্রেড করার চেষ্টা করে তখন আমার প্রশ্নগুলি হিট হয়।
জয় মোদি

স্থানান্তরগুলি হ'ল ডেটাবেসে আপনার যে পরিবর্তনগুলি হয়েছিল তার ট্র্যাক রেকর্ড। আমার মাইগ্রেশন চেইন কাজ বন্ধ করে দিলে আমি ভোকিমানের পরামর্শ একবারে নিয়েছি।
অ্যাডাম স্টারহহ

1

একটি সহজ উপায়

প্রতিটি অ্যাপে যান এবং মাইগ্রেশন ফাইলগুলি মুছুন।

তারপরে ডাটাবেসের জ্যাঙ্গো-মাইগ্রেশন টেবিলে যান এবং এটি কেটে ফেলুন (সমস্ত এন্ট্রি মুছুন)।

এরপরে আপনি আবারও মাইগ্রেশন তৈরি করতে পারবেন।


4
মাইগ্রেশন ফাইলগুলি মুছে ফেলার সময়, নিশ্চিত করুন যে আপনি init ফাইলগুলি মুছবেন না ।
স্প্রিশ

এটি সত্যিই আমাকে সাহায্য করেছিল। আমি সমস্ত মাইগ্রেশন মুছে ফেলেছি, আমার স্ক্য্লাইট ডিবি থেকে টেবিলগুলি ফেলে দিয়েছি, তবে এখনও তারা স্থানান্তর করতে অক্ষম ছিল ... তবে আমি একবার _init_ .py ফাইল ( দোহ ) পুনরুদ্ধার করেছিলাম আমি আবার অভিবাসনে সক্ষম হয়ে ক্রুজিং করতে সক্ষম হয়েছি। @ স্প্রাক্স = লাইফসেভার!
twknab

0

সিডিআর থেকে এসসিআর ডিরেক্টরিতে 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 $$;

migration.sh ফাইল:

#!/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

আপনার অ্যাপ্লিকেশনের সাথে সঙ্গতিপূর্ণ পথগুলি অবশ্যই পরিবর্তন করতে ভুলবেন না। আমার কাছে এই স্ক্রিপ্টগুলি ব্যক্তিগতভাবে প্রজেক্ট_রূট / স্ক্রিপ্ট / লোকাল নামে একটি ফোল্ডারে রয়েছে এবং জ্যাঙ্গোর উত্সগুলি প্রকল্প_রূট / এসসিআর-তে রয়েছে।


0

আমার অ্যাপ্লিকেশনে প্রতিটি "মাইগ্রেশন" ফোল্ডার মুছে ফেলার পরে (ম্যানুয়ালি), আমি দৌড়েছি:

./manage.py dbshell
delete from django_migrations;

তারপরে আমি ভেবেছিলাম আমি ./manage.py makemigrationsতাদের সবকটি নতুন করে তৈরি করতে পেরেছি । তবে, কোনও পরিবর্তন সনাক্ত করা যায়নি। আমি তখন একবারে একটি অ্যাপ নির্দিষ্ট করার চেষ্টা করেছি: ./manage.py makemigrations foo, ./manage.py makemigrations bar। তবে এর ফলে বিজ্ঞপ্তি নির্ভরতাগুলি সমাধান করা যায় নি।

অবশেষে, আমি একটি একক মেকমিগ্রেশন কমান্ড চালিয়েছি যা আমার সমস্ত অ্যাপ্লিকেশন নির্দিষ্ট করে (কোনও নির্দিষ্ট ক্রমে নয়):

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

এইবার, এটি কাজ করেছিল - বিজ্ঞপ্তি নির্ভরতা স্বয়ংক্রিয়ভাবে সমাধান হয়ে যায় (এটি প্রয়োজনীয় যেখানে অতিরিক্ত মাইগ্রেশন ফাইল তৈরি করেছে)।

তারপরে আমি দৌড়াতে সক্ষম হয়েছি ./manage.py migrate --fakeএবং ব্যবসায় ফিরে এসেছি ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.