كيف يمكنني إعادة تسمية عمود قاعدة البيانات في عملية ترحيل Ruby on Rails؟




ruby-on-rails ruby-on-rails-3 (16)

إذا كان العمود مملوءًا بالفعل بالبيانات ويعيش في الإنتاج ، فإنني أوصي بنهج خطوة بخطوة ، وذلك لتجنب التوقف في الإنتاج أثناء انتظار عمليات الترحيل.

أولاً ، سأقوم بإنشاء ترحيل 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 في الخلفية.

أدرك أن هذا أكثر انخراطا في عملية ما ، لكنني أفضل أن أفعل ذلك من أن يكون لديك مشكلات في ترحيل الإنتاج الخاص بي.

أنا بشكل غير صحيح اسم عمود hased_password بدلا من hashed_password .

كيف يمكنني تحديث مخطط قاعدة البيانات ، باستخدام الترحيل لإعادة تسمية هذا العمود؟


إذا كنت بحاجة إلى تبديل أسماء الأعمدة ، فستحتاج إلى إنشاء عنصر نائب لتجنب حدوث خطأ في اسم العمود المكرر . إليك مثال على ذلك:

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

افتح وحدة التحكم Ruby on Rails وأدخل:

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

المنظمة البحرية الدولية ، في هذه الحالة ، أفضل استخدام rake db:rollback . ثم عدّل الترحيل ، ثم اكتب rake db:migrate مرة أخرى. ومع ذلك ، إذا كانت لديك بيانات في العمود لا تريد أن تفقدها ، فاستخدم rename_column .


بالنسبة لـ Ruby on Rails 4:

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

تشغيل 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 لمعرفة ما إذا كان الاسم قد تغير بالفعل في قاعدة البيانات!

أتمنى أن يساعدك هذا :)


قم بتشغيل الأمر أدناه لإنشاء ملف ترحيل:

rails g migration ChangeHasedPasswordToHashedPassword

ثم في الملف الذي تم إنشاؤه في المجلد db/migrate rename_column ، اكتب rename_column النحو التالي:

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

لديك طريقتان للقيام بذلك:

  1. في هذا النوع ، يتم تشغيل الرمز العكسي له تلقائيًا عند التراجع.

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. إلى هذا النوع ، يتم تشغيل الأسلوب لأعلى عند تشغيل 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 النحو التالي.

rename_column :your_table_name, :hased_password, :hashed_password

من واجهة برمجة التطبيقات:

rename_column(table_name, column_name, new_column_name)

إنها تعيد تسمية أحد الأعمدة لكنها تحافظ على النوع والمحتوى ثابتًا.


يدويا يمكننا استخدام الطريقة أدناه:

يمكننا تعديل الترحيل يدويًا مثل:

  • افتح app/db/migrate/xxxxxxxxx_migration_file.rb

  • تحديث hased_password إلى hashed_password

  • قم بتشغيل الأمر أدناه

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

بعد ذلك ستزيل الترحيل الخاص بك:

$> rake db:migrate:up VERSION=xxxxxxxxx

ستضيف الترحيل باستخدام التغيير المحدّث.


إنشاء ترحيل Ruby on Rails :

$:> rails g migration Fixcolumnname

أدخل الكود في ملف الترحيل (XXXXXfixcolumnname.rb) :

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

إنشاء ملف الترحيل:

rails g migration FixName

# ينشئ db / migrate / xxxxxxxxxx.rb

عدّل الترحيل لتنفيذ إرادتك.

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

 def change
    rename_column :table_name, :old_column_name, :new_column_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




migration