PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

रेल 5 स्कीमा फ़ाइल में अगली विधि क्यों जोड़ रहा है?

यह उत्तर का थोड़ा लंबा है, इसलिए मैंने इसे खंडों में तोड़ दिया है। कमर कस लें!

मेरा सिद्धांत

मेरा अनुमान है कि आपका विकास डेटाबेस करता है 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 में बहुत अच्छी तरह से नया हो सकता है। पहले, रेल ने केवल इस बात पर भरोसा किया होगा कि आपके आईडी कॉलम में एक सामान्य डिफ़ॉल्ट था, और जो भी मूल्य वास्तव में देखा गया था उसे अनदेखा कर दिया। लेकिन मैंने यह देखने के लिए शोध नहीं किया है कि यह सच है या नहीं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ecto और Elixir . के साथ डिफ़ॉल्ट डेटाटाइम

  2. आप एक यादृच्छिक स्ट्रिंग कैसे बनाते हैं जो PostgreSQL में सत्र आईडी के लिए उपयुक्त है?

  3. पीडीओ php . का उपयोग कर डेटाबेस में नेमस्पेस के साथ क्रमबद्ध वस्तु को कैसे स्टोर करें?

  4. क्या निर्धारित करता है कि रेल में तालिका परिभाषा में आईडी ::सीरियल शामिल है?

  5. क्या CSV प्रारूप के साथ Postgres COPY कमांड में कोट प्रोसेसिंग को बंद करना संभव है?