জ্যাঙ্গো-ডিবি-মাইগ্রেশনস: সারণি পরিবর্তন করতে পারে না কারণ এটিতে ট্রেন্ডিং ইভেন্টগুলি মুলতুবি রয়েছে


121

আমি একটি টেক্সটফিল্ড থেকে নাল = সত্য মুছে ফেলতে চাই:

-    footer=models.TextField(null=True, blank=True)
+    footer=models.TextField(blank=True, default='')

আমি একটি স্কিমা মাইগ্রেশন তৈরি করেছি:

manage.py schemamigration fooapp --auto

কিছু পাদলেখ কলামে যেহেতু মাইগ্রেশন চালানো হয় সেগুলি NULLআমি errorপেয়েছি:

django.db.utils.IntegrityError: কলাম "পাদচরণ" নাল মান ধারণ করে

আমি এটি স্কিমা মাইগ্রেশনে যুক্ত করেছি:

    for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
        sender.footer=''
        sender.save()

এখন আমি পেয়েছি:

django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events

কি সমস্যা?


1
এই প্রশ্নটি অনুরূপ: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ২৪৪৯৯৯৩৩/২ এবং এর উত্তরগুলি ছিল যা আমার কাছে বেশি কার্যকর।
চামচমাইজার

উত্তর:


138

এর আর একটি কারণ হতে পারে কারণ আপনি NOT NULLযখন কলামটির ইতিমধ্যে NULLমান রয়েছে তখন সেট করার চেষ্টা করেছিলেন ।


7
এটির সমাধান করতে আপনি হয় একটি ডেটা মাইগ্রেশন ব্যবহার করতে পারেন বা ম্যানুয়ালি (ম্যানেজ.পি.পি শেল) যেতে পারেন এবং অ-
আনুগত্যের

@ এমগোজাহান আপনি কীভাবে এটি করেন?
পিরামিডফেস

1
@ পিরামিডফেস আপনি যদি খুব পিক না হন তবে জ্যাঞ্জো শেলের মধ্যে নাল মানগুলি আপডেট করতে পারেন। যদি আপনি আরও আনুষ্ঠানিক এবং পরীক্ষামূলক কিছু অনুসন্ধান করে থাকেন তবে এটি নির্ভর করে আপনি কোন সংস্করণ ব্যবহার করছেন। আপনি যদি দক্ষিণ ব্যবহার করেন তবে দেখুন: দক্ষিণ. readthedocs.org/en/latest/tutorial/part3.html এবং যদি আপনি জ্যাঙ্গোর মাইগ্রেশন ব্যবহার করেন তবে "ডেটা মাইগ্রেশন" বিভাগটি এখানে দেখুন: ডকস.ডজ্যাঙ্গোপ্রজেক্ট /en/1.8/topics/ মাইগ্রেশন
এমজিওজন

131

প্রতিটি মাইগ্রেশন একটি লেনদেনের মধ্যে থাকে। PostgreSQL এ আপনাকে অবশ্যই টেবিলটি আপডেট করতে হবে না এবং তারপরে একটি লেনদেনে টেবিলের স্কিমা পরিবর্তন করতে হবে।

আপনাকে ডেটা মাইগ্রেশন এবং স্কিমা মাইগ্রেশনকে বিভক্ত করতে হবে। প্রথমে এই কোড দিয়ে ডেটা মাইগ্রেশন তৈরি করুন:

 for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
    sender.footer=''
    sender.save()

তারপরে স্কিমা মাইগ্রেশন তৈরি করুন:

manage.py schemamigration fooapp --auto

এখন আপনার দুটি লেনদেন এবং দুটি পদক্ষেপে মাইগ্রেশন কাজ করা উচিত।


8
পোস্টগ্র্রেএসকিউএল সম্ভবত এই ধরনের লেনদেনের বিষয়ে তার আচরণ পরিবর্তন করেছে, কারণ আমি সার্ভারে (পোস্টগ্রিসকিউএল ৯.১) ব্যর্থ হওয়ার সাথে সাথে আমার ডেভ মেশিনে ডেটা এবং স্কিমা পরিবর্তনগুলি (পোস্টগ্র্রেএসকিউএল ৯.৪) উভয় দিয়ে মাইগ্রেশন চালাতে সক্ষম হয়েছি।
বারট্র্যান্ড বর্ডেজ

1
আমার জন্য প্রায় একই। এটি আজ অবধি 100+ মাইগ্রেশন (~ 20 ডেটা মাইগ্রেশন সহ) এর জন্য নির্বিঘ্নে কাজ করেছে, যখন ডেটা মাইগ্রেশনের আগে অনুলিপি অপসারণের পাশাপাশি অনন্য একসাথে সীমাবদ্ধতা যুক্ত করেছে adding পোস্টগ্রিএসকিউএল 10.0
লিনপি ফ্যান

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

1
@ ডৌজিফ্রেশ এটি কি জ্যাঙ্গোর একটি নথিযুক্ত বৈশিষ্ট্য?
গেটলি

আমি আসলে এটি কোথাও দেখতে পাচ্ছি না, আমি যা পর্যবেক্ষণ করেছি। docs.djangoproject.com/en/2.2/ref/migration-operation/…
ডগিফ্রেশ

9

সবেমাত্র এই সমস্যাটি আঘাত করেছেন। আপনি স্কিমা পরিবর্তন থেকে ডেটা পরিবর্তনগুলি পৃথক করতে স্কিমা মাইগ্রেশনে db.start_transaction () এবং db.commit_transaction () ব্যবহার করতে পারেন। পৃথক ডেটা মাইগ্রেশন হিসাবে সম্ভবত এতটা পরিষ্কার নয় তবে আমার ক্ষেত্রে আমার স্কিমা, ডেটা এবং তার পরে অন্য স্কিমা মাইগ্রেশন লাগবে তাই আমি একবারে এটি করার সিদ্ধান্ত নিয়েছিলাম।


7
এই সমাধানটির সমস্যাটি হ'ল: db.commit_transaction () এর পরে যদি আপনার স্থানান্তর ব্যর্থ হয় তবে কী হবে? আপনার যদি এটির প্রয়োজন হয় তবে আমি তিনটি স্থানান্তর ব্যবহার করতে পছন্দ করি: স্কিমা-মাইগ, ডেটা-মাইগ, স্কিমা-মাইগ।
গেটলি

5
দেখুন: django.readthedocs.io/en/latest/ref/migration-operations.html DDL লেনদেন (SQLite এবং PostgreSQL) সমর্থন করে এমন ডাটাবেসে, রানপাইথন অপারেশনগুলিতে প্রতিটি মাইগ্রেশনের জন্য তৈরি লেনদেনের পাশাপাশি কোনও লেনদেন স্বয়ংক্রিয়ভাবে যুক্ত হয় না। সুতরাং, পোস্টগ্রেএসকিউএলে, উদাহরণস্বরূপ, আপনার একই মাইগ্রেশনে স্কিমা পরিবর্তন এবং রানপাইথন অপারেশনগুলির সমন্বয় করা এড়ানো উচিত বা আপনি অপারেশনালআরারের মতো ত্রুটিগুলিতে আঘাত করতে পারেন: টেবিলটিকে "মাইটেবল" পারবেন না কারণ এতে ট্রেন্ডিং ইভেন্টগুলি মুলতুবি রয়েছে।
ইসমিনি গমেস 10


0

আপনি কলামের স্কিমা পরিবর্তন করছেন। সেই পাদলেখ কলামে আর একটি ফাঁকা মান থাকতে পারে না। Column কলামটির জন্য ডিবিতে ইতিমধ্যে খালি মানগুলি সঞ্চিত রয়েছে। জাজানো মাইগ্রেট কমান্ডের সাহায্যে আপনার ডিবিতে থাকা ফাঁকা সারিগুলি ফাঁকা থেকে এখন ডিফল্ট মানটিতে আপডেট করতে চলেছে। জ্যাঙ্গো সেই সারিগুলি আপডেট করার চেষ্টা করে যেখানে পাদলেখ কলামটির একটি ফাঁকা মূল্য রয়েছে এবং একই সাথে মনে হয় স্কিমার পরিবর্তন করুন (আমি নিশ্চিত নই)।

সমস্যাটি হ'ল আপনি একই কলামের স্কিমাটি পরিবর্তন করতে পারবেন না আপনি একই সাথে মানগুলি আপডেট করার চেষ্টা করছেন।

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


1
কিছু স্ক্রিপ্ট চালানো আমার পক্ষে আসলে একটি বিকল্প নয়। আমার কাছে ডাটাবেসের বেশ কয়েকটি উদাহরণ রয়েছে এবং ধারাবাহিক স্থাপনার প্রক্রিয়াটিতে কেবল "ম্যানেজ.পি মাইগ্রেট" ডাকে। এই প্রশ্নটি ইতিমধ্যে বৈধ উত্তর যা ভাল কাজ করে।
গুয়েতলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.