यह उत्तर का थोड़ा लंबा है, इसलिए मैंने इसे खंडों में तोड़ दिया है। कमर कस लें!
मेरा सिद्धांत
मेरा अनुमान है कि आपका विकास डेटाबेस करता है lessons_id_seq
शामिल करें अनुक्रम, और इसकी परिभाषा flightlessons.id
इस पर निर्भर होने के लिए सेट है (यानी, रेल आपकी स्कीमा फ़ाइल में क्या डाल रहा है)।
कैसे और क्यों? आपने संभवतः lessons
. का नाम बदल दिया है flightlessons
. के लिए तालिका अतीत में किसी बिंदु पर, लेकिन उस नाम ने उस क्रम को नहीं बदला जिस पर तालिका निर्भर थी -- और चूंकि schema.rb
नहीं . करता है रिकॉर्ड अनुक्रम, lessons_id_seq
अनुक्रम आपके परीक्षण डेटाबेस में कॉपी नहीं होता है, और इस प्रकार आपको यह त्रुटि मिलती है।
मेरे सिद्धांत को सत्यापित करने के लिए, rails db
चलाएं और निम्न आदेशों का प्रयास करें:
\d lessons_id_seq
इसे उस अनुक्रम की परिभाषा वापस करनी चाहिए। फिर, कोशिश करें:
\d flightlessons
और id
. की परिभाषा देखें कॉलम। मुझे उम्मीद है कि इसमें DEFAULT nextval('lessons_id_seq')
शामिल होंगे ।
ठीक करता है
इसे ठीक करने का सबसे आसान तरीका structure.sql
. का उपयोग करना है schema.rb
. के बजाय (देखें दस्तावेज़
) यह आपके डेटाबेस की सटीक स्थिति को संभालेगा और रेल द्वारा किसी भी हस्तक्षेप या व्याख्या से बच जाएगा, जो कि आपकी वर्तमान समस्या का कारण बन रहा है। मैं हमेशा structure.sql
का सुझाव देता हूं उत्पादन प्रणालियों के लिए।
हालाँकि, आप अपने विकास डेटाबेस में भी जा सकते हैं और अनुक्रम का नाम बदल सकते हैं:
ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');
यह एक उत्पादन प्रणाली पर एक भयानक विचार होगा, लेकिन यदि आपकी समस्या सिर्फ स्थानीय है, तो इसे आपके schema.rb
के साथ आपकी वर्तमान डेटाबेस स्थिति को सुधारना चाहिए। और इस प्रकार अपनी वर्तमान समस्या का समाधान करें। यदि आप rails db:drop db:create db:migrate
चाहते हैं, तो आप इसे माइग्रेशन में एनकोड करना चाहेंगे। एक नए ऐप पर काम करने के लिए।
अब क्यों?
व्यवहार जहां रेल default
को डंप कर रहा है आपकी तालिका की प्राथमिक कुंजी के लिए मूल्य रेल 5 में बहुत अच्छी तरह से नया हो सकता है। पहले, रेल ने केवल इस बात पर भरोसा किया होगा कि आपके आईडी कॉलम में एक सामान्य डिफ़ॉल्ट था, और जो भी मूल्य वास्तव में देखा गया था उसे अनदेखा कर दिया। लेकिन मैंने यह देखने के लिए शोध नहीं किया है कि यह सच है या नहीं।