मैंने hased_password
इसके बजाय गलत तरीके से एक कॉलम का नाम दिया hashed_password
।
इस कॉलम का नाम बदलने के लिए माइग्रेशन का उपयोग करके मैं डेटाबेस स्कीमा को कैसे अपडेट करूं?
मैंने hased_password
इसके बजाय गलत तरीके से एक कॉलम का नाम दिया hashed_password
।
इस कॉलम का नाम बदलने के लिए माइग्रेशन का उपयोग करके मैं डेटाबेस स्कीमा को कैसे अपडेट करूं?
जवाबों:
rename_column :table, :old_column, :new_column
आप शायद ऐसा करने के लिए एक अलग माइग्रेशन बनाना चाहते हैं। (आपका FixColumnName
जैसा भी नाम हो।):
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
फिर db:migrate
हमेशा की तरह या फिर आप अपने व्यवसाय के बारे में जाने।
रेल के लिए 4:
Migration
एक स्तंभ का नाम बदलने के लिए बनाते समय , रेल 4 change
इसके बजाय एक विधि उत्पन्न करता है up
और down
जैसा कि ऊपर दिए गए अनुभाग में बताया गया है। उत्पन्न change
विधि है:
$ > rails g migration ChangeColumnName
जो इसके समान एक माइग्रेशन फ़ाइल बनाएगा:
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
self.up
मैं यह नहीं कहूंगा कि self.down
" हमेशा विपरीत होना चाहिए "। आपके प्रवास के संदर्भ पर निर्भर करता है। बस "विपरीत" डालने से "सही" डाउन माइग्रेशन नहीं हो सकता है।
def self.up
और def self.down
साथ def change
है और यह पता चल जाएगा कि कैसे रोलबैक करने के लिए।
change
विधि पूर्ण प्रमाण नहीं है, इसलिए जटिल माइग्रेशन के लिए उपयोग up
और down
विधियों का उपयोग करें ।
मेरी राय में, इस मामले में, इसका उपयोग करना बेहतर है rake db:rollback
, फिर अपने प्रवास को संपादित करें और फिर से चलाएं rake db:migrate
।
हालाँकि, यदि आपके पास उस स्तंभ में डेटा है जिसे आप खोना नहीं चाहते हैं, तो उपयोग करें rename_column
।
यदि स्तंभ पहले से ही डेटा के साथ आबाद है और उत्पादन में रहता है, तो मैं एक कदम से कदम दृष्टिकोण की सिफारिश करूंगा, ताकि पलायन की प्रतीक्षा करते समय उत्पादन में डाउनटाइम से बचा जा सके।
पहले मैं नए नाम के साथ कॉलम जोड़ने और पुराने कॉलम नाम से मानों के साथ पॉप्युलेट करने के लिए db माइग्रेशन बनाऊंगा।
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
पृष्ठभूमि में चलाएं ।
मुझे लगता है कि यह एक प्रक्रिया में थोड़ा अधिक शामिल है, लेकिन मैं ऐसा नहीं करूंगा कि मेरे उत्पादन प्रवास के साथ समस्याएं हैं।
execute "Update table_name set correct_name_column_one = old_name_column_one"
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
के अंतर्गत Available Transformations
rename_column(table_name, column_name, new_column_name):
एक स्तंभ का नाम बदलता है, लेकिन प्रकार और सामग्री रखता है।
rename_column
भी देखें ।
माइग्रेशन फ़ाइल बनाने के लिए नीचे कमांड चलाएँ:
rails g migration ChangeHasedPasswordToHashedPassword
फिर db/migrate
फ़ोल्डर में उत्पन्न फ़ाइल में , rename_column
नीचे लिखें :
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
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
अधिक जानकारी के लिए आप आगे बढ़ सकते हैं: रूबी ऑन रेल्स - माइग्रेशन या एक्टिव रिकॉर्ड माइग्रेशन ।
यदि आपका कोड अन्य के साथ साझा नहीं किया गया है, तो सबसे अच्छा विकल्प यह है कि rake db:rollback
प्रवास में और फिर अपना कॉलम नाम संपादित करें rake db:migrate
। बस
और आप स्तंभ का नाम बदलने के लिए एक और माइग्रेशन लिख सकते हैं
def change
rename_column :table_name, :old_name, :new_name
end
बस।
rake db:rollback
बहुत अच्छा सुझाव है। लेकिन जैसा कि आपने कहा, केवल तभी जब माइग्रेशन को आगे नहीं बढ़ाया गया हो।
एक वैकल्पिक विकल्प के रूप में, यदि आप प्रवासियों के विचार से शादी नहीं करते हैं, तो ActiveRecord के लिए एक सम्मोहक रत्न है जो आपके लिए नाम परिवर्तन को स्वचालित रूप से संभाल लेगा, Datamapper शैली। आपको बस अपने मॉडल में कॉलम का नाम बदलना है (और सुनिश्चित करें कि आपने Model.auto_upgrade को अपने मॉडल के निचले भाग पर स्थित किया है) और viola! डेटाबेस मक्खी पर अद्यतन किया जाता है।
https://github.com/DAddYE/mini_record
नोट: संघर्ष को रोकने के लिए आपको db / स्कीमा.rb को nuke करना होगा
अभी भी बीटा चरणों में और स्पष्ट रूप से सभी के लिए नहीं है, लेकिन फिर भी एक सम्मोहक विकल्प है (मैं वर्तमान में दो गैर-तुच्छ उत्पादन एप्लिकेशन में इसका उपयोग कर रहा हूं जिसमें कोई समस्या नहीं है)
यदि आपको कॉलम नामों को स्विच करने की आवश्यकता है, तो आपको डुप्लिकेट कॉलम नाम त्रुटि से बचने के लिए प्लेसहोल्डर बनाने की आवश्यकता होगी । यहाँ एक उदाहरण है:
class SwitchColumns < ActiveRecord::Migration
def change
rename_column :column_name, :x, :holder
rename_column :column_name, :y, :x
rename_column :column_name, :holder, :y
end
end
यदि आपके लिए वर्तमान डेटा महत्वपूर्ण नहीं है, तो आप अपने मूल माइग्रेशन को नीचे ले जा सकते हैं:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
उद्धरण के बिना, फिर मूल माइग्रेशन में परिवर्तन करें और अप माइग्रेशन को फिर से चलाएं:
rake db:migrate
रूबी के लिए रेल 4 पर:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
मैन्युअल रूप से हम नीचे दी गई विधि का उपयोग कर सकते हैं:
हम माइग्रेशन को मैन्युअल रूप से संपादित कर सकते हैं जैसे:
खुला हुआ app/db/migrate/xxxxxxxxx_migration_file.rb
को अपडेट hased_password
करेंhashed_password
नीचे दिए गए आदेश चलाएँ
$> rake db:migrate:down VERSION=xxxxxxxxx
तब यह आपके प्रवासन को हटा देगा:
$> rake db:migrate:up VERSION=xxxxxxxxx
यह अद्यतन परिवर्तन के साथ आपके प्रवासन को जोड़ेगा।
Daud rails g migration ChangesNameInUsers
(या जो भी आप इसे नाम देना चाहेंगे)
माइग्रेशन फ़ाइल खोलें, जो अभी जेनरेट हुई है, और इस लाइन को विधि में जोड़ें (बीच में def change
और end
):
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
फ़ाइल को सहेजें, और rake db:migrate
कंसोल में चलाएं
schema.db
डेटाबेस में नाम वास्तव में बदल गया है या नहीं यह देखने के लिए अपना चेक आउट करें !
उम्मीद है की यह मदद करेगा :)
चलो KISS । यह सब तीन सरल कदम है। रेल 5.2 के लिए निम्नलिखित कार्य करता है ।
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
- इस तरह यह बाद में कोड बेस के रखवाले के लिए पूरी तरह से स्पष्ट है। (तालिका नाम के लिए एक बहुवचन का उपयोग करें)।
# I prefer to explicitly write the
ऊपर and
नीचेmethods.
# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb
class RenameNameToFullNameInStudents < ActiveRecord::Migration[5.2]
def up
# rename_column :table_name, :old_column, :new_column
rename_column :students, :name, :full_name
end
def down
# Note that the columns are reversed
rename_column :students, :full_name, :name
end
end
rake db:migrate
और आप दौड़ से दूर हैं!
$: 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
रेल कंसोल पर अपनी रूबी खोलें और दर्ज करें:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
आपके पास ऐसा करने के दो तरीके हैं:
इस प्रकार में यह स्वचालित रूप से इसका उल्टा कोड चलाता है, जब रोलबैक होता है।
def change
rename_column :table_name, :old_column_name, :new_column_name
end
इस प्रकार के लिए, यह अप विधि rake db:migrate
को चलाता है और जब डाउन विधि को चलाता है 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
मैं ५.२ रेल पर हूँ, और एक उपयोगकर्ता पर एक कॉलम का नाम बदलने की कोशिश कर रहा हूं।
rename_column
बिट मेरे लिए काम किया, लेकिन विलक्षण :table_name
एक फेंक दिया त्रुटि "उपयोगकर्ता तालिका नहीं मिला"। मेरे लिए बहुवचन काम किया।
rails g RenameAgentinUser
फिर माइग्रेशन फ़ाइल को इसमें बदलें:
rename_column :users, :agent?, :agent
कहां: एजेंट? पुराना कॉलम नाम है।
अद्यतन - create_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
#...
कमांड का उपयोग करके माइग्रेशन उत्पन्न करें
rails g migration rename_hased_password
उसके बाद परिवर्तन विधि में माइग्रेशन जोड़ें निम्नलिखित पंक्ति जोड़ें
rename_column :table, :hased_password, :hashed_password
यह काम कर जाना चाहिए।
5 प्रवास परिवर्तन
उदाहरण के लिए:
रेल जी मॉडल छात्र student_name: स्ट्रिंग आयु: पूर्णांक
यदि आप name के रूप में student_name कॉलम बदलना चाहते हैं
नोट: - यदि आप रेल नहीं चलाते हैं तो db: माइग्रेट करें
आप निम्न चरण कर सकते हैं
रेल d मॉडल छात्र student_name: स्ट्रिंग आयु: पूर्णांक
यह उत्पन्न माइग्रेशन फ़ाइल को निकाल देगा, अब आप अपना कॉलम नाम सही कर सकते हैं
रेल जी मॉडल छात्र का नाम: स्ट्रिंग आयु: पूर्णांक
यदि आप माइग्रेट किए गए हैं (रेल डीबी: माइग्रेट करें), कॉलम नाम बदलने के विकल्प के बाद
रेल g माइग्रेशन RemoveStudentNameFromStudent student_name: string
रेल g माइग्रेशन AddNameToStudent नाम: string
rails g migration RemoveStudentNameFromStudentS student_name:string
(छात्र बहुवचन हैं)?