আমি এর 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
রেলগুলির জন্য ৩.১ ব্যবহার করুন:
যদিও 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
।
কলামটি যদি ইতিমধ্যে ডেটা দিয়ে সজ্জিত হয়ে থাকে এবং উত্পাদনে বেঁচে থাকে তবে আমি মাইগ্রেশনের জন্য অপেক্ষা করার সময় উত্পাদনের ডাউনটাইম এড়াতে যাতে ধাপে ধাপে পদ্ধতির প্রস্তাব দিই।
প্রথমে আমি নতুন নাম (গুলি) সহ কলাম যুক্ত করতে একটি পুরানো কলামের নাম থেকে মানগুলি তৈরি করতে একটি ডিবি মাইগ্রেশন তৈরি করব।
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
একটি দুর্দান্ত পরামর্শ। তবে আপনি যেমন বলেছিলেন, কেবলমাত্র যদি মাইগ্রেশনটি এখনও ঠেলাঠেলি করা হয় না।
বিকল্প বিকল্প হিসাবে, যদি আপনি মাইগ্রেশনের ধারণার সাথে বিবাহিত না হন তবে অ্যাক্টিভেকর্ডের জন্য একটি বাধ্যতামূলক রত্ন রয়েছে যা আপনার জন্য নাম পরিবর্তন করে, ডেটাম্পার শৈলীর পরিচালনা করবে। আপনি যা করেন তা হ'ল আপনার মডেলের কলামের নাম পরিবর্তন করুন (এবং নিশ্চিত করুন যে আপনি মডেল.আটো_গ্রেড! আপনার মডেল.আরবি এর নীচে রেখেছেন) এবং ভায়োলা! উড়ে ডেটাবেস আপডেট করা হয়।
https://github.com/DAddYE/mini_record
দ্রষ্টব্য: দ্বন্দ্ব রোধ করতে আপনার প্রয়োজন হবে ডিবি / স্কিমা.আরবি
এখনও বিটা পর্যায়ক্রমে এবং স্পষ্টতই সবার জন্য নয় তবে এখনও একটি বাধ্যবাধকতা পছন্দ (বর্তমানে আমি এটি কোনও সমস্যা ছাড়াই দুটি অ-তুচ্ছ উত্পাদন অ্যাপ্লিকেশনগুলিতে ব্যবহার করছি)
আপনার যদি কলামের নাম পরিবর্তন করতে হয় তবে ডুপ্লিকেট কলাম নামের ত্রুটি এড়াতে আপনাকে স্থানধারক তৈরি করতে হবে । এখানে একটি উদাহরণ:
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
এটি আপডেট হওয়া পরিবর্তনের সাথে আপনার মাইগ্রেশন যুক্ত করবে।
চালান 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
নামটি ডাটাবেসে বাস্তবে পরিবর্তিত হয়েছে কিনা তা পরীক্ষা করে দেখুন!
আশাকরি এটা সাহায্য করবে :)
আসুন কিআইএসএস করি । এটি লাগে তিনটি সহজ পদক্ষেপ। নিম্নলিখিত কারাগার 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
আমি 5.2 রেলগুলিতে আছি এবং একটি ছদ্মবেশী ব্যবহারকারীর উপর একটি কলামের নাম পরিবর্তন করার চেষ্টা করছি।
rename_column
বিট আমার জন্য কাজ, কিন্তু একবচন :table_name
একটি ছুড়ে ফেলে ত্রুটি "ব্যবহারকারী টেবিল পাওয়া যায়নি"। বহুবচন আমার পক্ষে কাজ করেছিল।
rails g RenameAgentinUser
তারপরে মাইগ্রেশন ফাইলটি এতে পরিবর্তন করুন:
rename_column :users, :agent?, :agent
কোথায়: এজেন্ট? পুরানো কলামের নাম।
আপডেট - ক্রিয়েট টেবিলের একটি ঘনিষ্ঠ কাজিন হ'ল চ্যানেল_টিবল, বিদ্যমান টেবিলগুলি পরিবর্তনের জন্য ব্যবহৃত হয়। এটি তৈরি করতে_ টেবিলের অনুরূপ ফ্যাশনে ব্যবহৃত হয় তবে ব্লকটিতে প্রাপ্ত বস্তুটি আরও কৌশলগুলি জানে। উদাহরণ স্বরূপ:
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 মাইগ্রেশন পরিবর্তন করে
উদাহরণ:
রেলস জি মডেল ছাত্র ছাত্রী নাম: স্ট্রিং বয়স: পূর্ণসংখ্যা
যদি আপনি নাম হিসাবে ছাত্র_নাম কলাম পরিবর্তন করতে চান
দ্রষ্টব্য: - আপনি রেল চালনা না করলে db: স্থানান্তর করুন
আপনি নিম্নলিখিত পদক্ষেপগুলি করতে পারেন
রেল d মডেল ছাত্র ছাত্রী নাম: স্ট্রিং বয়স: পূর্ণসংখ্যা
এটি উত্পন্ন স্থানান্তর ফাইলটি সরিয়ে ফেলবে, এখন আপনি নিজের কলামের নামটি সংশোধন করতে পারেন
রেলস জি মডেল শিক্ষার্থীর নাম: স্ট্রিং বয়স: পূর্ণসংখ্যা
যদি আপনি স্থানান্তরিত হন (রেলস ডিবি: মাইগ্রেট), কলামের নাম পরিবর্তন করতে নিম্নলিখিত বিকল্পগুলি
রেল g মাইগ্রেশন সরান স্টুডেন্টনামফ্রমে স্টুডেন্ট ছাত্র_নাম: স্ট্রিং
রেলস জি মাইগ্রেশন অ্যাডনামটোস্টুডেন্ট নাম: স্ট্রিং
rails g migration RemoveStudentNameFromStudentS student_name:string
(শিক্ষার্থীরা বহুবচন)?