रेल प्रवास का उपयोग करके कॉलम कैसे छोड़ें


जवाबों:


917
remove_column :table_name, :column_name

उदाहरण के लिए:

remove_column :users, :hobby

उपयोगकर्ता तालिका से शौक कॉलम को हटा देगा।


9
और यह अंदर upऔर downतरीकों से सुनिश्चित करें , न कि change, जैसा कि @Powers द्वारा उत्तर में समझाया गया है।
XåpplI'-I0llwlg'I -

7
@ XåpplI'-I0llwlg'I- टिप्पणी के लिए धन्यवाद। परिवर्तन पद्धति का उपयोग रेल 4 अनुप्रयोगों में एक कॉलम को छोड़ने के लिए किया जा सकता है, लेकिन इसका उपयोग रेल 3 में नहीं किया जाना चाहिए। मैंने अपने उत्तर को तदनुसार अपडेट किया।
पॉवर्स

9
आप विधि के remove_column :table_name, :column_name, :type, :optionsभीतर भी उपयोग कर सकते हैं change, यदि आप निर्दिष्ट करते हैं कि माइग्रेशन को फिर से टाइप करना संभव है। प्रलेखन से: और मानकों मौजूद होने पर ध्यान नहीं दिया जाएगा। यह एक माइग्रेशन विधि में प्रदान करने के लिए सहायक हो सकता है ताकि इसे वापस लाया जा सके। उस स्थिति में, और add_column द्वारा उपयोग किया जाएगा। typeoptionschangetypeoptions
निकोलस

24
Rails4 में, आप किसी स्तंभ को changeविधि में निकाल सकते हैं , लेकिन केवल यदि आप स्तंभ प्रकार निर्दिष्ट करते हैं। जैसे remove_column, :table_name, :column_name, :column_type। अन्यथा आप माइग्रेशन को चलाने का प्रयास करते समय निम्न त्रुटि प्राप्त करेंगे:remove_column is only reversible if given a type
डेनिस

5
यह मुख्य उत्तर में ध्यान देने योग्य हो सकता है कि एक कॉलम को हटाने से संबंधित इंडेक्स नहीं
निकलता

371

रेल के पुराने संस्करणों के लिए

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

रेल 3 और ऊपर के लिए

rails generate migration RemoveFieldNameFromTableName field_name:datatype

18
"रेल्स जी" का उपयोग "रेल्स जेनरेट" के विकल्प के रूप में किया जा सकता है
नोज़ सेप

44
rails g migration remove_field_name_from_table_name field_name:datatypeयह भी काम करता है
स्टुअर्ट नेल्सन

6
यह भी ध्यान दें कि AddXXXtoTTTएक RemoveXXXFromTTTfiled_name की एक सफेद रिक्ति सूची के द्वारा पीछा किया जा सकता है: DATA_TYPE, और उचित add_column और remove_column बयान बनाया जाएगा: rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integerएक भी पलायन का उपयोग कर दो विशेषताओं को हटा। यह भी ध्यान दें कि remove_columnद्वारा समर्थित नहीं है changeविधि है, तो आप दोनों लिखने के लिए है upऔर down
क्लाउडियो फ्लोरनी

3
रेल 4 इसके लिए समर्थन करने लगता है change। रोलबैक उसी तरह काम करता है जैसे उसे करना चाहिए।
अज्ञात_ग्य

2
@AdamGrant मुझे लगता है कि यदि आप एक ऐसी changeविधि का उपयोग कर रहे हैं जो कि वापस हो सकती है * तो आपको डेटा प्रकार (और अन्य सभी फ़ील्ड संशोधक) को सूचित करने की आवश्यकता होगी, इसलिए यदि आप उस माइग्रेशन को रोलबैक करते हैं, तो फ़ील्ड को सही तरीके से फिर से बनाया जा सकता है। * जब मैं कहता हूं कि यह उल्टा है, तो डेटाबेस संरचना के संदर्भ में, निश्चित रूप से, उस कॉलम का डेटा स्पष्ट रूप से खो जाएगा।
RFVoltolini

117

रेल 4 को अपडेट किया गया है, इसलिए किसी कॉलम को छोड़ने के लिए माइग्रेशन में परिवर्तन विधि का उपयोग किया जा सकता है और माइग्रेशन सफलतापूर्वक रोलबैक हो जाएगा। कृपया रेल 3 एप्लिकेशन के लिए निम्नलिखित चेतावनी पढ़ें:

रेल 3 चेतावनी

कृपया ध्यान दें कि जब आप इस कमांड का उपयोग करते हैं:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

उत्पन्न माइग्रेशन कुछ इस तरह दिखाई देगा:

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end

डेटाबेस तालिका से कॉलम हटाते समय परिवर्तन पद्धति का उपयोग न करें (उदाहरण के लिए रेल एप्लिकेशन में माइग्रेशन फ़ाइल में जो आप नहीं चाहते हैं):

  def change
    remove_column :table_name, :field_name
  end

जब यह हटाने के लिए आता है, तो रेल 3 में परिवर्तन विधि स्मार्ट नहीं है, इसलिए आप इस माइग्रेशन को रोलबैक नहीं कर पाएंगे।


3
फिर रेक डीबी चलाएं: माइग्रेट करें
रॉक्सडुरैज़ो

1
@ पॉवर्स - शानदार और स्पष्ट उत्तर - क्या आप निम्नलिखित पर विस्तार से बता पाएंगे: "रेल 3 में परिवर्तन विधि स्मार्ट नहीं है जब इसे हटाने के लिए आता है_ कॉलम, तो आप इस माइग्रेशन को रोलबैक नहीं कर पाएंगे।"
BKSpurgeon

1
@BKSpurgeon - रेल 3 में, यदि आप changeविधि का उपयोग करते हैं , तो rake db:rollbackकमांड त्रुटि करेगा। rake db:rollbackमूल रूप से इसके विपरीत है rake db:migrate। यह बग रेल 4 :)
पॉवर्स

2
रेल 4 में, मैंने एक बदलाव ड्रॉप कॉलम रोलबैक करने की कोशिश की। यह विफल रहता है और बताता है कि आपको data_type (जैसा कि आपके उत्तर में कोड में है) निर्दिष्ट करना होगा
rmcsharry

1
वही समस्या मुझे @rmcsharry के रूप में हुई। मेरा रेल संस्करण 4.2.2 है और मैंने परिवर्तन विधि का उपयोग किया है। जब मैंने रोलबैक करने का प्रयास किया, तो त्रुटि आई कि एक प्रकार दिया गया तो remove_column केवल प्रतिवर्ती है।
एम। हबीब

38

Rails4 ऐप में कॉलम को हटाने के लिए परिवर्तन विधि का उपयोग करना संभव है। तीसरा परम डेटा_टाइप है और वैकल्पिक में आप विकल्प दे सकते हैं। यह डॉक्यूमेंटेशन के सेक्शन 'उपलब्ध ट्रांसफॉर्मेशन' में थोड़ा छिपा हुआ है ।

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

27

ऐसा करने के दो अच्छे तरीके हैं:

remove_column

आप बस remove_column का उपयोग कर सकते हैं, जैसे:

remove_column :users, :first_name

यह ठीक है अगर आपको केवल अपने स्कीमा में एक ही बदलाव करने की आवश्यकता है।

change_table block

आप change_table block का उपयोग करके भी ऐसा कर सकते हैं, जैसे:

change_table :users do |t|
  t.remove :first_name
end

मुझे यह पसंद है क्योंकि मुझे यह अधिक सुपाच्य लगता है, और आप एक साथ कई बदलाव कर सकते हैं।

यहां समर्थित चेंज_टेबिल तरीकों की पूरी सूची दी गई है:

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


15

रेल में 5 आप टर्मिनल में इस कमांड का उपयोग कर सकते हैं:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

उदाहरण के लिए टेबल उपयोगकर्ताओं से कॉलम access_level (स्ट्रिंग) को हटाने के लिए:

rails generate migration remove_access_level_from_users access_level:string

और फिर चलाएं:

rake db:migrate

14

किसी स्तंभ को निकालने के लिए माइग्रेशन उत्पन्न करें जैसे कि यदि वह माइग्रेट ( rake db:migrate) है, तो उसे कॉलम को छोड़ देना चाहिए । और यह कॉलम वापस जोड़ना चाहिए यदि यह माइग्रेशन रोलबैक किया गया है ( rake db:rollback)।

वाक्य रचना:

remove_column: table_name,: column_name, टाइप करें

यदि स्तंभ रोलबैक किया गया है, तो स्तंभ को निकालता है, स्तंभ को भी जोड़ता है।

उदाहरण:

remove_column :users, :last_name, :string

नोट : यदि आप data_type को छोड़ते हैं , तो माइग्रेशन कॉलम को सफलतापूर्वक हटा देगा लेकिन यदि आप माइग्रेशन को रोलबैक करते हैं तो यह एक एरर फेंक देगा।


13

रेल के लिए स्पष्ट और सरल निर्देश 5.2

  • चेतावनी: यदि आप अपने डेटाबेस से एक कॉलम निकालते हैं तो आप डेटा खो देंगे । आगे बढ़ने के लिए, नीचे देखें:
  • चेतावनी: नीचे दिए गए निर्देश तुच्छ पलायन के लिए हैं । लाखों और लाखों पंक्तियों के साथ जटिल माइग्रेशन के लिए, आपको विफलताओं की संभावना के लिए ध्यान देना होगा, आपको यह भी सोचना होगा कि अपने माइग्रेशन का अनुकूलन कैसे करें ताकि वे तेजी से चलें, और संभावना है कि उपयोगकर्ता आपके ऐप का उपयोग करेंगे माइग्रेशन प्रक्रिया हो रही है। यदि आपके पास कई डेटाबेस हैं, या यदि कुछ भी दूर से जटिल है, तो कुछ भी गलत होने पर मुझे दोष न दें!

1. माइग्रेशन बनाएं

अपने टर्मिनल में निम्न कमांड चलाएँ :

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

नोट: टेबल नाम रेल कन्वेंशन के अनुसार बहुवचन रूप में होना चाहिए।

उदाहरण:

मेरे मामले में मैं तालिका acceptedसे स्तंभ (बूलियन मान) निकालना चाहता हूं quotes:

rails g migration RemoveAcceptedFromQuotes accepted:boolean

प्रलेखन को फिर से देखें : एक सम्मलेन जब एक तालिका में फ़ील्ड्स जोड़ते / हटाते हैं:

एक तालिका में फ़ील्ड्स जोड़ने के लिए माइग्रेशन उत्पन्न करने के लिए एक विशेष वाक्यात्मक शॉर्टकट है।

रेल से माइग्रेशन add_fieldname_to_tablename फ़ील्ड नाम: फ़ील्डटाइप उत्पन्न होता है

2. माइग्रेशन जांचें

# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
  # with rails 5.2 you don't need to add a separate "up" and "down" method.
  def change
    remove_column :quotes, :accepted, :boolean
  end
end

3. माइग्रेशन चलाएं

rake db:migrate

.... और फिर आप दौड़ से बाहर हो गए!


अब पलायन भी चलाया जा सकता हैrails db:migrate
इमरान अली

12

5 एप्लिकेशन के लिए कॉलम निकालें

rails g migration Remove<Anything>From<TableName> [columnName:type]

ऊपर दिए गए कमांड db/migrateनिर्देशिका के अंदर एक माइग्रेशन फ़ाइल उत्पन्न करते हैं । स्निपेट झटका रेल जनरेटर द्वारा उत्पन्न तालिका उदाहरण से हटाए गए कॉलम में से एक है,

class RemoveAgeFromUsers < ActiveRecord::Migration
  def up
    remove_column :users, :age
  end
  def down
    add_column :users, :age, :integer
  end
end

मैंने रेल के लिए एक त्वरित संदर्भ मार्गदर्शिका भी बनाई, जो यहां मिल सकती है



10
rails g migration RemoveXColumnFromY column_name:data_type

X = कॉलम नाम
Y = तालिका नाम

संपादित करें

बदल दिया RemoveXColumnToYकरने के लिए RemoveXColumnFromYटिप्पणियों के अनुसार - क्या प्रवास वास्तव में क्या कर रहा है के लिए और अधिक स्पष्टता प्रदान करता है।


3
"कॉलम को टेबल से हटाएं " अजीब लगता है, इसलिए यहां से बेहतर विकल्प लगता है।
सेबस्टियन वोम मीर


8

स्तंभ को तालिका से निकालने के लिए आपको निम्नलिखित माइग्रेशन को चलाना होगा:

rails g migration remove_column_name_from_table_name column_name:data_type

फिर कमांड चलाएं:

rake db:migrate

5

नीचे दिए गए आदेश यह अपने आप माइग्रेशन फ़ाइल में जोड़ देगा

rails g migration RemoveColumnFromModel

कमांड के ऊपर चलने के बाद आप माइग्रेशन फ़ाइल को हटा सकते हैं remove_column कोड को अपने आप वहाँ जोड़ा जाना चाहिए

फिर db माइग्रेट करें

rake db:migrate


5

निम्नानुसार केवल 3 चरणों में तालिका से स्तंभ हटाने के लिए:

  1. यह कमांड लिखें

rails g migration remove_column_from_table_name

इस नाम और टाइम स्टैम्प द्वारा बनाई गई टर्मिनल एक फाइल में इस कमांड को चलाने के बाद (remove_column from_table_name)।

फिर इस फाइल पर जाएं।

  1. फाइल के अंदर आपको लिखना है

    remove_column :table_name, :column_name

  2. अंत में कंसोल पर जाएं और फिर करें

    rake db:migrate



1


remove_column :table_name, :column_name
एक माइग्रेशन फ़ाइल के माध्यम से

आप टाइप करके सीधे रेल कंसोल में एक कॉलम हटा सकते हैं:
ActiveRecord::Base.remove_column :table_name, :column_name


1

इसे अवश्य पसंद करें;

rails g migration RemoveColumnNameFromTables column_name:type

अर्थात rails g migration RemoveTitleFromPosts title:string

वैसे भी, रनटाइम के दौरान डाउनटाइम के साथ-साथ ActiveRecord कैश डेटाबेस कॉलम के बारे में विचार करना बेहतर होगा, ताकि यदि आप कोई कॉलम ड्रॉप करते हैं, तो यह आपके ऐप के रिबूट होने तक अपवाद हो सकता है।

रेफरी: मजबूत प्रवास



1

पहले कमांड चलाने वाली माइग्रेशन फ़ाइल बनाने का प्रयास करें:

rails g migration RemoveAgeFromUsers age:string

और फिर प्रोजेक्ट के रूट डायरेक्टरी पर कमांड चलाने वाले माइग्रेशन को चलाएं:

rails db:migrate
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.