জ্যাঙ্গো দক্ষিণ ব্যবহার করে মাইগ্রেশন ইতিহাস পুনরায় সেট করার প্রস্তাবিত পদ্ধতির কী?


153

আমি দক্ষিণ (0.7) এবং জ্যাঙ্গো (1.1.2) ব্যবহার করে বেশ কয়েকটি স্থানান্তর সংগ্রহ করেছি যা আমার ইউনিট পরীক্ষায় বেশ কিছুটা সময় ব্যয় করতে শুরু করেছে। আমি বেসলাইনটি পুনরায় সেট করতে এবং মাইগ্রেশনের একটি নতুন সেট শুরু করতে চাই। আমি দক্ষিণ ডকুমেন্টেশন পর্যালোচনা করেছি, স্বাভাবিক গুগল / স্ট্যাকওভারফ্লো অনুসন্ধান করেছি (যেমন "জাঙ্গো দক্ষিণ (পুনরায় সেট করুন বা মুছুন বা মুছুন) স্থানান্তরের ইতিহাস") এবং স্পষ্ট কিছু খুঁজে পাইনি।

যে পদ্ধতির জন্য আমি চিন্ত করেছি সেগুলির মধ্যে দক্ষিণে "দক্ষিণ" মুছে ফেলা বা "ম্যানুয়ালি" ইতিহাস মুছে ফেলা (যেমন ডিবি টেবিল সাফ করুন, মাইগ্রেশন ডিরেক্টর থেকে মাইগ্রেশন ফাইলগুলি সরিয়ে ফেলুন) এবং কেবল পুনরায় চালানো উচিত involve

./manage.py স্কিমাইগ্রেশন সাউথটুট - ইনিটিয়াল

সুতরাং, যদি কেউ এর আগেও এটি করে থাকে এবং কিছু টিপস / পরামর্শ থাকে তবে তাদের প্রশংসা করা হবে।


কখনও কখনও আপনাকে ম্যানুয়ালি যুক্ত __init__.pyকরতে হবেappname/migrations
laike9m

2
আপনি কীভাবে মাইগ্রেশনটিকে 1.7 (বিল্ট-ইন মাইগ্রেশন সহ) রিসেট করবেন?
টিমো

1
@ টিমো: docs.djangoproject.com/en/dev/topics/migrations/… একটি পদ্ধতির হতে পারে। আপনি কেবলমাত্র আপনার মাইগ্রেশন / ডিরেক্টরিগুলি মুছে ফেলতে এবং পুনরায় ইস্যু ./manage.py makemigrationsকরতে পারেন তবে আপনি যদি নতুন
ডিজি

আমি মনে করি squashmigrationsসঠিক উত্তর
জুলিও মেরিনস

উত্তর:


121

সম্পাদনা করুন - আমি এর উপরে নীচে একটি মন্তব্য দিচ্ছি কারণ এটি>> গ্রহণযোগ্য উত্তরের আগে যা @andybak অনুসরণ করে তা পড়া গুরুত্বপূর্ণ

@ ডমিনিক: ম্যানেজ.পি রিসেট দক্ষিন সম্পর্কিত আপনার পরামর্শটি বিপজ্জনক এবং প্রকল্পের দক্ষিণে কোনও তৃতীয় পক্ষের অ্যাপ্লিকেশন উপস্থিত থাকলে ডাটাবেস নষ্ট করতে পারে, নীচে @ নীচের দ্বারা চিহ্নিত করা হয়েছে। যেহেতু আপনার উত্তরটির অনেকগুলি আপত্তি রয়েছে তবে আমি যদি এটি সম্পাদনা করতে পারি এবং এটি সম্পর্কে কমপক্ষে একটি সতর্কতা যুক্ত করতে পারি, বা (আরও ভাল) এটি @Hobs পদ্ধতির প্রতিফলিত করার জন্য এটি পরিবর্তন করতে পারি (যা ঠিক তত সুবিধাজনক তবে এটি নয়) অন্যান্য অ্যাপ্লিকেশনগুলিকে প্রভাবিত করুন) - ধন্যবাদ! - ক্রিসভ 26 মার্চ 9 '9 এ 13 মার্চ

গৃহীত উত্তর নীচে অনুসরণ:

প্রথমত, দক্ষিণ লেখকের একটি উত্তর :

যতক্ষণ আপনি একযোগে সমস্ত মোতায়েনের বিষয়ে এটি যত্ন নেবেন ততক্ষণ এটিকে নিয়ে কোনও সমস্যা হওয়া উচিত নয়। ব্যক্তিগতভাবে, আমি করতাম:

    rm -r appname/migrations/ 
    ./manage.py reset south 
    ./manage.py convert_to_south appname 

(লক্ষ্য করুন যে " reset south" অংশটি সমস্ত অ্যাপ্লিকেশনের জন্য মাইগ্রেশন রেকর্ডস সাফ করে, তাই আপনি নিশ্চিত হয়ে নিন যে আপনি অন্য দুটি অ্যাপ্লিকেশনের জন্য দুটি লাইন চালাচ্ছেন বা নির্বাচন করে মুছবেন)।

convert_to_southশেষে কল একটি নতুন মাইগ্রেশন করে তোলে এবং এটা (যেহেতু আপনার ডাটাবেস ইতিমধ্যে সংশ্লিষ্ট টেবিল আছে) জাল- প্রযোজ্য। প্রক্রিয়া চলাকালীন সমস্ত অ্যাপ টেবিল ফেলে দেওয়ার দরকার নেই।

যখন আমি এই সমস্ত অপ্রয়োজনীয় ডেভ স্থানান্তর থেকে মুক্তি পাওয়ার দরকার হয় তখন আমি আমার ডেভ + প্রোডাকশন সার্ভারে যা করছি তা এখানে:

  1. আমাদের উভয় পক্ষের একই ডিবি স্কিমা রয়েছে তা নিশ্চিত করুন
  2. উভয় পক্ষের প্রতিটি মাইগ্রেশন ফোল্ডার মুছুন
  3. উভয় পক্ষের ./manage.py পুনরায় সেট করুন দক্ষিণে (পোস্ট হিসাবে বলা আছে) = দক্ষিণ টেবিল সাফ করুন *
  4. উভয় পক্ষেই ./manage.py রূপান্তর_ to_sus চালান (0001 মাইগ্রেশন নকল )
  5. তারপরে আমি আমার সার্ভারে মাইগ্রেশনগুলি পুনরায় শুরু করতে এবং মাইগ্রেশন ফোল্ডারগুলিকে পুশ করতে পারি

* আপনি যদি অন্যদের মধ্যে কেবল একটি অ্যাপ্লিকেশন পরিষ্কার করতে চান তবে যদি আপনার দক্ষিণ_ ইতিহাসের টেবিলটি সম্পাদনা করতে হবে এবং আপনার অ্যাপ্লিকেশন সম্পর্কে কেবলমাত্র এন্ট্রি মুছতে হবে।


2
কেবল রেকর্ডের জন্য, দক্ষিণ লেখকের প্রতিক্রিয়া নিম্নরূপ: যতক্ষণ আপনি একযোগে সমস্ত মোতায়েনের উপর এটি চালানোর বিষয়ে যত্ন নেন ততক্ষণ এ নিয়ে কোনও সমস্যা হওয়া উচিত নয়। ব্যক্তিগতভাবে, আমি করতাম: rm -r অ্যাপনেম / মাইগ্রেশন / ./manage.py রিসেট দক্ষিণ। সমস্ত অ্যাপ্লিকেশনগুলির জন্য অন্য দুটি লাইন বা নির্বাচনী মোছা)।
অ্যাডরিয়ান টিজসেলিং

2
এটিও নোট করুন যে আপনি যদি টেবিলগুলি ফেলে manage.py schemamigration app name --initialরাখেন তবে আপনার রূপান্তর_পরে_সোথের পরিবর্তে প্রয়োজন ।
অ্যাডরিয়ান টিজসেলিং

7
জ্যাঙ্গো ২.৩ হিসাবে, "রিসেট" পরিচালনা কমান্ডটি চলে গেছে। পরিবর্তে, আপনি মোটামুটি কিছু করতে চাইবেন south.models.MigrationHistory.objects.all().delete()
অ্যান্ড্রু বি।

13
@Dominique: সংক্রান্ত আপনার পরামর্শ manage.py reset southহল বিপজ্জনক এবং ডাটাবেসের ধ্বংস করতে পারে কোন তৃতীয় পক্ষের প্রকল্পে দক্ষিণ ব্যবহার অ্যাপস আছে, তাহলে নীচের @thnee দ্বারা সরু আউট হিসাবে। যেহেতু আপনার উত্তরটির অনেকগুলি আপত্তি রয়েছে তবে আমি যদি এটি সম্পাদনা করতে পারি এবং এটি সম্পর্কে কমপক্ষে একটি সতর্কতা যুক্ত করতে পারি, বা (আরও ভাল) এটি @Hobs পদ্ধতির প্রতিফলিত করার জন্য এটি পরিবর্তন করতে পারি (যা ঠিক তত সুবিধাজনক তবে এটি নয়) অন্যান্য অ্যাপ্লিকেশনগুলিকে প্রভাবিত করুন) - ধন্যবাদ!
ক্রিসভ

3
কেন এটি এত উচ্চ upvated ছিল? আপনার দক্ষিণ-অভিবাসন ইতিহাস সারণীটি প্রায় কখনও মুছে ফেলা উচিত নয়। আপনি যে স্পর্শ করতে চান না সেই মাইগ্রেশনগুলির সাথে এটি কোনও নির্ভরশীল অ্যাপ্লিকেশনগুলিকে পুরোপুরি স্ক্রু করবে। হাবের উত্তরটি সঠিক।
সেরিন

188

আপনি বেছে বেছে করার প্রয়োজন হলে রিসেট মাইগ্রেশন যে খুব বেশি সময় নিচ্ছে হয় (মাত্র এক অ্যাপের জন্য), এই আমার জন্য কাজ করেন।

rm <app-dir>/migrations/*
python manage.py schemamigration <app-name> --initial
python manage.py migrate <app-name> 0001 --fake  --delete-ghost-migrations

আপনার ফাইলের মতো লাইনগুলি যুক্ত করে ম্যানুয়ালি অন্য অ্যাপ্লিকেশনগুলির উপর কোনও নির্ভরতা পুনরুদ্ধার করতে ভুলবেন না , ঠিক নীচে আপনার মাইগ্রেশন ক্লাসে প্রথম বৈশিষ্ট্য হিসাবে ।depends_on = (("<other_app_name>", "0001_initial"),("<yet_another_app_name>", "0001_initial"))<app-dir>/migrations/0001_initial.pyclass Migration(SchemaMigration):

তারপরে আপনি ./manage.py migrate <app-name> --fake --delete-ghost-migrationsএই অন্য উত্তরের জন্য অন্য পরিবেশে যেতে পারেন । অবশ্যই যদি আপনি জাল মুছে ফেলতে অথবা জাল migrate zeroআপনি নিজে মত একটি মাইগ্রেশন যে কোনো বাম-উপর ডিবি টেবিল মোছার প্রয়োজন করব এই

./manage.py migrate --fake --delete-ghost-migrationsলাইভ ডিপ্লোয়মেন্ট সার্ভারে আরও একটি পারমাণবিক বিকল্প হ'ল তারপরে [আমার] স্ক্যালডাম্প। তারপরে যে পরিবেশগুলি আপনার স্থানান্তরিত, সম্পূর্ণ জনবহুল ডিবি প্রয়োজন সেই পরিবেশগুলিতে [আমার] বর্গ স্কুলে ফেলে দেওয়া পাইপ। দক্ষিণ ত্যাগ, আমি জানি, কিন্তু আমার জন্য কাজ।


2
আমি যা চাই তা হ'ল মডেল.পি কে সুসমাচার হিসাবে গ্রহণ করুন এবং সেদিক থেকে আমাকে পরিষ্কার করুন "। সুতরাং স্ক্র্যাচ থেকে একটি স্থাপনা সেট আপ করার ক্ষমতা বা বিদ্যমান স্থাপনা থেকে কাজ ধরে রাখা।
ব্রাইস

1
এটিই তাই করে।
hobs

2
@ হাবস আমি DependsOnUnknownMigrationনতুন প্রাথমিক স্থানান্তরকে জালিয়ে তুলছিলাম । আপনার মন্তব্যের জন্য ধন্যবাদ, আমি বুঝতে পারি যে depends_onবিবৃতিটি এই অ্যাপ্লিকেশনটিকে যেখানেই বোঝায় সেখানে আপডেট করা উচিত । এটি সত্যিই এখানে সেরা উত্তর। ধন্যবাদ! :)
মানু

55

ডোমিনিক গার্দিওলা এবং হবসের উত্তরগুলির জন্য ধন্যবাদ, এটি আমাকে একটি কঠিন সমস্যা সমাধানে সহায়তা করেছে। তবে সমাধানের সাথে বেশ কয়েকটি সমস্যা রয়েছে, এটি আমার গ্রহণযোগ্য।

ব্যবহার manage.py reset southআপনার যদি দক্ষিণ ব্যবহার করে এমন কোনও তৃতীয় পক্ষের অ্যাপ থাকে তবে করা ভাল ধারণা নয় (django-cms

reset south আপনি যে সমস্ত অ্যাপ্লিকেশন ইনস্টল করেছেন তার সমস্ত স্থানান্তরের ইতিহাস মুছে ফেলবে।

এখন বিবেচনা করুন যে আপনি সর্বশেষতম সংস্করণে আপগ্রেড করেছেন django-cms, এতে নতুন মাইগ্রেশনগুলির মতো থাকবে 0009_do_something.py। দক্ষিণ নিশ্চয় বিভ্রান্ত করা হবে যখন আপনি করেও যে মাইগ্রেশন চালানোর চেষ্টা 0001মাধ্যমে 0008মাইগ্রেশন ইতিহাসে।

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


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

1. আমার অ্যাপ্লিকেশনগুলির জন্য মাইগ্রেশন ইতিহাস মুছুন

sql> delete from south_migrationhistory where app_name = 'my_app';

২. আমার অ্যাপ্লিকেশনগুলির জন্য মাইগ্রেশন মুছুন

$ rm -rf my_app/migrations/

৩. আমার অ্যাপ্লিকেশনগুলির জন্য নতুন প্রাথমিক মাইগ্রেশন তৈরি করুন

$ ./manage.py schemamigration --initial my_app

৪. আমার অ্যাপ্লিকেশনগুলির জন্য প্রাথমিক মাইগ্রেশন কার্যকর করে নকল

এটি south_migrationhistoryপ্রকৃত টেবিলগুলিকে স্পর্শ না করে মাইগ্রেশনগুলিকে সন্নিবেশ করায় :

$ ./manage.py migrate --fake my_app

পদক্ষেপ 3 এবং 4 আসলে কেবল একটি দীর্ঘতর বৈকল্পিক manage.py convert_to_south my_app, তবে আমি সেই অতিরিক্ত নিয়ন্ত্রণ পছন্দ করি, যেমন উত্পাদন ডেটাবেস সংশোধন করার মতো নাজুক পরিস্থিতিতে।


2
আপনি যে সমস্যার সন্ধান পেয়েছেন তার সমাধানগুলি সংশোধন করার জন্য আমি আমার উত্তর সম্পাদনা করেছি (কেবলমাত্র আপনার উত্তরের ভিত্তিতে সেগুলি অনুমান করা) এবং লক্ষ লক্ষ সারি সহ এটি একটি প্রোডাক্ট ডেটাবেজে পরীক্ষা করেছি।
hobs

2
এটি আমরা যা করছি তা বেশ কার্যকর। আপনি যদি পদক্ষেপ 4 - ডিলেট-ভুত-মাইগ্রেশন বিকল্পটি ব্যবহার করেন, আপনি পদক্ষেপ 1 ছেড়ে যেতে পারেন
টুবাইচ

আপনি ./manage.py migrate --fakeযদি অন্য অ্যাপ্লিকেশনগুলিতে মাইগ্রেশন মুলতুবি রয়েছে এমন জাল মাইগ্রেট করতে না চান তবে আপনার অ্যাপ্লিকেশন নামগুলি স্পষ্টভাবে উল্লেখ করতে হবে।
wadim

2
@ ওয়াদিম এহেতু পদক্ষেপ 0: "নিশ্চিত হয়ে নিন যে আপনার ডিস্কে স্থানান্তর এবং ডাটাবেসে কার্যকর হওয়া মাইগ্রেশনগুলির মধ্যে কোনও অবকাশ নেই"।
Thnee

ঠিক আছে এটি সম্ভবত উল্লেখ করার মতো যে আপনি 0 টি ধাপে সমস্ত ইনস্টল থাকা অ্যাপ্লিকেশনগুলিকে উল্লেখ করছেন? যদিও আপনি 0 পদক্ষেপটি সম্পাদন করার কোনও সহজ উপায় সম্পর্কে জানেন?
wadim

7

থানির মতো (তার উত্তর দেখুন), আমরা দক্ষিণের লেখকের (অ্যান্ড্রু গডউইন) পরামর্শটি এখানে অন্য কোথাও উদ্ধৃত করার জন্য একটি হালকা পদ্ধতির ব্যবহার করছি, এবং স্থাপনার সময় আমরা ডাটাবেসে যা করি তার থেকে কোড বেসের সাথে আমরা কী করব তা আলাদা করছি loyment , কারণ আমাদের পুনরাবৃত্তিযোগ্য হতে মোতায়েনের প্রয়োজন:

আমরা কোডে কি করি:

# Remove all the migrations from the app
$ rm -fR appname/migrations
# Make the first migration (don't touch the database)
$ ./manage.py schemamigration appname --initial

এই কোডটি ডিফল্ট হয়ে যাওয়ার পরে আমরা ডাটাবেসে কী করি

# Fake the migration history, wiping out the rest
$ ./manage.py migrate appname --fake --delete-ghost-migrations

আমি মনে করি আমি ঠিক একই কাজটি করেছি, তবে --delete_ghoist- মাইগ্রেশন ব্যবহার না করে ম্যানুয়ালি ডাটাবেস এন্ট্রি মুছে ফেলছি। আপনার উপায়টি কিছুটা সুন্দর।
wobbily_col

1

আপনি যদি কেবল ডিভ মেশিনে কাজ করে থাকেন তবে আমি একটি পরিচালনা কমান্ড লিখেছিলাম যা ডমিনিকের পরামর্শ মতো বেশিরভাগ ক্ষেত্রে কাজ করে।

http://balzerg.blogspot.co.il/2012/09/django-app-reset-with-south.html

দক্ষিণ লেখকের পরামর্শের বিপরীতে, এটি দক্ষিণ ব্যবহার করে অন্য ইনস্টল করা অ্যাপ্লিকেশনগুলিকে ক্ষতি করবে না।


এবং যদি, লেখকের বিপরীতে, আপনি বিদ্যমান স্থানান্তরগুলি রাখতে চান (যেমন আপনি মাইগ্রেশন ইতিহাসের পাশাপাশি অ্যাপটি পুনরায় সেট করতে চান তবে প্রকৃত স্থানান্তরগুলি রাখতে চান), তবে আপনি এটি চেষ্টা করতে পারেন: goo.gl/0ZnWm
mgalgs

1

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

একবারের জন্য:

(1) find . -type d -name migrations -exec git rm -rf '{}' \;
(2) find . -type d -name migrations -exec rm -rf '{}' \;
(3) ./manage.py schemamigration <APP_NAME> --initial
(4) [GIT COMMIT]

ধাক্কা দেওয়ার আগে আপনার প্রকল্পটি বুটস্ট্র্যাপিং করুন। তারপরে, প্রতিটি স্থানীয় / রিমোট মেশিনের জন্য, নিম্নলিখিত প্রয়োগ করুন:

(5) [GIT PULL]
(6) ./manage.py reset south
(7) ./manage.py migrate --fake

আপনি পুনরায় অন্তর্ভুক্ত করতে চান এমন প্রতিটি অ্যাপের জন্য প্রাথমিক (3) করুন । মনে রাখবেন যে, রিসেট (6) কেবলমাত্র মাইগ্রেশন ইতিহাস মুছে ফেলবে, সুতরাং গ্রন্থাগারের জন্য ক্ষতিকারক নয়। ভুয়া স্থানান্তর ()) কোনও তৃতীয় পক্ষের ইনস্টল থাকা অ্যাপ্লিকেশনের মাইগ্রেশন ইতিহাস ফিরিয়ে দেবে।


0

অ্যাপ্লিকেশন ফোল্ডার থেকে প্রয়োজনীয় ফাইল মুছুন

উদাহরণ পাথ

 cd /usr/local/lib/python2.7/dist-packages/wiki/south_migrations

উইকি আমার অ্যাপ্লিকেশন

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