ruby-on-rails - रेल माइग्रेशन पर रुबी में डेटाबेस कॉलम का नाम कैसे बदल सकता हूं?




ruby-on-rails-3 migration (21)

मैंने गलत तरीके से hased_password बजाय कॉलम hased_password नाम दिया है।

इस कॉलम का नाम बदलने के लिए माइग्रेशन का उपयोग करके मैं डेटाबेस स्कीमा कैसे अपडेट करूं?


Answers

 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

रन rails g migration ChangesNameInUsers (या जो भी आप इसे नाम देना चाहते हैं) चलाएं

माइग्रेशन फ़ाइल खोलें जो अभी जेनरेट की गई है, और इस लाइन को विधि में जोड़ें ( def change और end बीच में):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

फ़ाइल को सहेजें, और rake db:migrate चलाएं rake db:migrate कंसोल में rake db:migrate करें

यह देखने के लिए कि क्या डेटाबेस वास्तव में डेटाबेस में बदल गया है, अपनी schema.db देखें!

उम्मीद है की यह मदद करेगा :)


बस एक नया माइग्रेशन बनाएं, और एक ब्लॉक में, rename_column उपयोग नीचे के रूप में करें।

rename_column :your_table_name, :hased_password, :hashed_password

ऐसा करने के आपके पास दो तरीके हैं:

  1. रोलबैक होने पर इस प्रकार में यह स्वचालित रूप से इसके विपरीत कोड चलाता है।

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. इस प्रकार के लिए, यह rake db:migrate दौरान अप विधि को चलाता है rake db:migrate और डाउन विधि rake db:rollback जब rake db:rollback :

    def self.up
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
    def self.down
      rename_column :table_name,:new_column_name,:old_column_name
    end
    

माइग्रेशन फ़ाइल बनाने के लिए नीचे दिए गए कमांड को चलाएं:

rails g migration ChangeHasedPasswordToHashedPassword

फिर db/migrate फ़ोल्डर में उत्पन्न फ़ाइल में, rename_column नीचे के रूप में लिखें:

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end

एपीआई से:

rename_column(table_name, column_name, new_column_name)

यह एक कॉलम का नाम बदलता है लेकिन प्रकार और सामग्री वही रहता है।


वैकल्पिक विकल्प के रूप में, यदि आप माइग्रेशन के विचार से विवाहित नहीं हैं, तो ActiveRecord के लिए एक आकर्षक मणि है जो स्वचालित रूप से आपके लिए नाम बदलता है, डेटामैपर शैली। आप जो भी करते हैं वह आपके मॉडल में कॉलम नाम बदलता है (और सुनिश्चित करें कि आपने मॉडल. auto_upgrade को अपने मॉडल.आरबी के नीचे रखा है) और व्हायोला! फ्लाई पर डाटाबेस अपडेट किया गया है।

https://github.com/DAddYE/mini_record

नोट: विवादों को रोकने के लिए आपको डीबी / schema.rb को नूक करने की आवश्यकता होगी

अभी भी बीटा चरणों में और स्पष्ट रूप से सभी के लिए नहीं, लेकिन अभी भी एक आकर्षक विकल्प है (मैं वर्तमान में इसे बिना किसी समस्या के दो गैर-तुच्छ उत्पादन अनुप्रयोगों में उपयोग कर रहा हूं)



अद्यतन - create_table का एक करीबी चचेरा भाई change_table है, जो मौजूदा तालिकाओं को बदलने के लिए उपयोग किया जाता है। इसका उपयोग create_table के समान रूप में किया जाता है लेकिन ब्लॉक पर उत्पन्न वस्तु अधिक चाल जानता है। उदाहरण के लिए:

class ChangeBadColumnNames < ActiveRecord::Migration
  def change
    change_table :your_table_name do |t|
      t.rename :old_column_name, :new_column_name
    end
  end
end

यदि हम अन्य परिवर्तन विधियों के साथ करते हैं तो इस तरह से अधिक कुशल है: इंडेक्स को हटाएं / इंडेक्स / इंडेक्स / कॉलम जोड़ें, उदाहरण के लिए हम आगे की तरह कर सकते हैं:

# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...

आईएमओ, इस मामले में, बेहतर उपयोग rake db:rollback । फिर अपने माइग्रेशन को संपादित करें और फिर rake db:migrate टाइप करें rake db:migrate । हालांकि, अगर आपके पास उस कॉलम में डेटा है जिसे आप खोना नहीं चाहते हैं, तो rename_column उपयोग rename_column


आदेश का उपयोग कर माइग्रेशन उत्पन्न करें

rails g migration rename_hased_password

उसके बाद माइग्रेशन परिवर्तन विधि में निम्न पंक्ति जोड़ें

rename_column :table, :hased_password, :hashed_password

यह काम कर जाना चाहिए।


रेल कंसोल पर अपनी रूबी खोलें और दर्ज करें:

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column

यदि कॉलम पहले से ही डेटा के साथ आबादी में है और उत्पादन में रहता है, तो मैं चरण-दर-चरण दृष्टिकोण की अनुशंसा करता हूं, ताकि माइग्रेशन की प्रतीक्षा करते समय उत्पादन में डाउनटाइम से बचें।

सबसे पहले मैं नए नामों के साथ कॉलम जोड़ने के लिए एक डीबी माइग्रेशन तैयार करता हूं और उन्हें पुराने कॉलम नाम से मानों के साथ पॉप्युलेट करता हूं।

class AddCorrectColumnNames < ActiveRecord::Migration
  def up
    add_column :table, :correct_name_column_one, :string
    add_column :table, :correct_name_column_two, :string

    puts 'Updating correctly named columns'
    execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
    end
  end

  def down
    remove_column :table, :correct_name_column_one
    remove_column :table, :correct_name_column_two
  end
end

तो मैं बस उस बदलाव को प्रतिबद्ध करता हूं, और परिवर्तन को उत्पादन में डाल देता हूं।

git commit -m 'adding columns with correct name'

फिर एक बार प्रतिबद्धता को उत्पादन में धकेल दिया गया है, तो मैं दौड़ूंगा।

Production $ bundle exec rake db:migrate

फिर मैं उन सभी विचारों / नियंत्रकों को अपडेट करूंगा जो पुराने कॉलम नाम को नए कॉलम नाम पर संदर्भित करते हैं। मेरे परीक्षण सूट के माध्यम से भागो, और केवल उन परिवर्तनों को प्रतिबद्ध करें। (यह सुनिश्चित करने के बाद कि यह स्थानीय रूप से काम कर रहा था और पहले सभी परीक्षणों को पार कर रहा था!)

git commit -m 'using correct column name instead of old stinky bad column name'

तब मैं उस प्रतिबद्धता को उत्पादन में धक्का दूंगा।

इस बिंदु पर आप माइग्रेशन से जुड़े किसी भी प्रकार के डाउनटाइम के बारे में चिंता किए बिना मूल कॉलम को हटा सकते हैं।

class RemoveBadColumnNames < ActiveRecord::Migration
  def up
    remove_column :table, :old_name_column_one
    remove_column :table, :old_name_column_two
  end

  def down
    add_column :table, :old_name_column_one, :string
    add_column :table, :old_name_column_two, :string
  end
end

फिर उत्पादन के लिए इस नवीनतम माइग्रेशन को दबाएं और bundle exec rake db:migrate चलाएं bundle exec rake db:migrate पृष्ठभूमि में bundle exec rake db:migrate करें।

मुझे एहसास है कि यह एक प्रक्रिया में थोड़ा अधिक शामिल है, लेकिन मैं अपने उत्पादन प्रवासन के साथ मुद्दों के बजाय ऐसा करना चाहता हूं।


रेल पर रूबी के लिए 4:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end

यदि वर्तमान डेटा आपके लिए महत्वपूर्ण नहीं है, तो आप इसका उपयोग करके अपना मूल माइग्रेशन ले सकते हैं:

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

उद्धरण के बिना, फिर मूल माइग्रेशन में परिवर्तन करें और फिर से माइग्रेशन चलाएं:

rake db:migrate

rename_column :table, :old_column, :new_column

अद्यतन करें:

आप शायद ऐसा करने के लिए एक अलग माइग्रेशन बनाना चाहते हैं। (जैसा आप करेंगे फिक्स कॉलमनाम नाम बदलें)

script/generate migration FixColumnName
# creates  db/migrate/xxxxxxxxxx_fix_column_name.rb

फिर अपनी इच्छा पूरी करने के लिए माइग्रेशन संपादित करें।

# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
  def self.up
    rename_column :table_name, :old_column, :new_column
  end

  def self.down
    # rename back if you need or do something else or do nothing
  end
end

रेल 3.1 के लिए एक अद्यतन

हालांकि, up और down विधियां अभी भी लागू होती हैं। रेल 3.1 को एक change विधि प्राप्त होती है जो "जानता है कि कैसे अपना डेटाबेस माइग्रेट करना है और जब इसे माइग्रेशन को अलग डाउन विधि लिखने की आवश्यकता के बिना वापस ले जाया जाता है तो इसे उलट देता है"

rails g migration FixColumnName

class FixColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

यदि आपके पास नाम बदलने के लिए कॉलम का पूरा समूह होता है, या ऐसा कुछ जो टेबल नाम को बार-बार दोहराने की आवश्यकता होती है।

rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...

चीजों को थोड़ा साफ रखने के लिए आप change_table का उपयोग कर सकते हैं।

class FixColumnNames < ActiveRecord::Migration
  def change
    change_table :table_name do |t|
      t.rename :old_column1, :new_column1
      t.rename :old_column2, :new_column2
      ...
    end
  end
end

विषय लाने के लिए धन्यवाद, Luke और Turadg

फिर बस db:migrate सामान्य रूप से db:migrate या फिर आप अपने व्यवसाय के बारे में जानें।

रेल 4 के लिए एक अद्यतन

एक कॉलम का नाम बदलने के लिए Migration बनाने के दौरान, रेल 4 ऊपर दिए गए उत्तर में उल्लिखित up और down की बजाय एक change विधि उत्पन्न करता है। उत्पन्न change विधि नीचे दी गई है:

$ > rails g migration ChangeColumnName

जो इस तरह के एक माइग्रेशन फ़ाइल बना देगा:

class ChangeColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

रेल पर रूबी के कुछ संस्करण माइग्रेशन के लिए ऊपर / नीचे विधि का समर्थन करते हैं और यदि आपके माइग्रेशन में अप / डाउन विधि है, तो:

def up
    rename_column :table_name, :column_old_name, :column_new_name
end

def down
    rename_column :table_name, :column_new_name, :column_old_name
end

यदि आपके प्रवासन में change विधि है, तो:

def change
    rename_column :table_name, :column_old_name, :column_new_name
end

अधिक जानकारी के लिए आप स्थानांतरित कर सकते हैं: रेल पर रूबी - माइग्रेशन या सक्रिय रिकॉर्ड माइग्रेशन


$:  rails g migration RenameHashedPasswordColumn
invoke  active_record
      create    db/migrate/20160323054656_rename_hashed_password_column.rb

उस माइग्रेशन फ़ाइल को खोलें और नीचे दी गई फ़ाइल को संशोधित करें (अपना मूल table_name दर्ज करें)

class  RenameHashedPasswordColumn < ActiveRecord::Migration
  def change
    rename_column :table_name, :hased_password, :hashed_password
  end
end

माइग्रेशन फ़ाइल जेनरेट करें:

rails g migration FixName

# डीबी / माइग्रेट / xxxxxxxxxx.rb बनाता है

अपनी इच्छानुसार माइग्रेशन संपादित करें।

class FixName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

यदि आपका कोड किसी अन्य के साथ साझा नहीं किया गया है, तो सबसे अच्छा विकल्प केवल rake db:rollback फिर माइग्रेशन और rake db:migrate में अपना कॉलम नाम संपादित करें rake db:migrate । बस

और आप कॉलम का नाम बदलने के लिए एक और माइग्रेशन लिख सकते हैं

 def change
    rename_column :table_name, :old_name, :new_name
  end

बस।


आप add_timestamps और null का उपयोग नहीं कर सकते: झूठी अगर आपके पास मौजूदा रिकॉर्ड हैं, तो यहां समाधान है:

def change
  add_timestamps(:buttons, null: true)

  Button.find_each { |b| b.update(created_at: Time.zone.now, updated_at: Time.zone.now) }

  change_column_null(:buttons, :created_at, false)
  change_column_null(:buttons, :updated_at, false)
end




ruby-on-rails ruby-on-rails-3 migration