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

StackOverflow https://stackoverflow.com/questions/1992019

سؤال

أنا أسمي بشكل خاطئ عمود 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

شكرًا لك، Luke && Turadg, ، لطرح الموضوع.

ثم فقط db:migrate كالمعتاد أو كما تذهب في عملك.


تحديث للقضبان 4

أثناء إنشاء Migration أما بالنسبة لإعادة تسمية العمود ، فإن Rails 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

نصائح أخرى

IMO ، في هذه الحالة ، أفضل استخدام 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 في الخلفية.

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

http://api.rubyonrails.org/classes/activerecord/migration.html

تحت Available Transformations

rename_column(table_name, column_name, new_column_name):

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

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

rails g migration ChangeHasedPasswordToHashedPassword

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

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

من API:

rename_column(table_name, column_name, new_column_name)

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

تدعم بعض إصدارات Ruby on Rails طريقة لأعلى/لأسفل للترحيل وإذا كان لديك طريقة لأعلى/لأسفل في ترحيلك ، ثم:

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

هذا هو.

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

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

كخيار بديل ، إذا لم تكن متزوجًا من فكرة الترحيل ، فهناك جوهرة مقنعة لـ ActivereCord والتي ستتعامل مع تغيير الاسم تلقائيًا لك ، نمط Datamapper. كل ما تفعله هو تغيير اسم العمود في النموذج الخاص بك (وتأكد من وضعك model.auto_upgrade! في الجزء السفلي من النموذج الخاص بك. rb) وفيولا! يتم تحديث قاعدة البيانات أثناء الطيران.

https://github.com/daddye/mini_record

ملاحظة: ستحتاج إلى NUKE DB/SCHEMA.RB لمنع النزاعات

لا يزال في مراحل بيتا ومن الواضح أنه ليس للجميع ولكن لا يزال خيارًا مقنعًا (أنا أستخدمه حاليًا في تطبيقين للإنتاج غير التافهة بدون مشاكل)

إذا لم تكن البيانات الحالية مهمة بالنسبة لك ، فيمكنك فقط إنزال ترحيلك الأصلي باستخدام:

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

بدون عروض الأسعار ، ثم قم بإجراء تغييرات في الترحيل الأصلي وقم بتشغيل الترحيل لأعلى مرة أخرى بواسطة:

rake db:migrate

ببساطة إنشاء ترحيل جديد ، وفي كتلة ، استخدم rename_column على النحو التالي.

rename_column :your_table_name, :hased_password, :hashed_password

لروبي على القضبان 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 FixName

# إنشاء DB/Migrate/xxxxxxxxx.rb

قم بتحرير الترحيل للقيام بإرادتك.

class FixName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
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 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
 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

توليد روبي على هجرة القضبان:

$:> rails g migration Fixcolumnname

إدراج رمز في ملف الترحيل (xxxxxfixColumnname.rb):

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

دعونا قبلة. كل ما يتطلبه الأمر هو ثلاث خطوات بسيطة. ما يلي يعمل ل القضبان 5.2.

1. إنشاء ترحيل

  • rails g migration RenameNameToFullNameInStudents

  • rails g RenameOldFieldToNewFieldInTableName - وبهذه الطريقة ، من الواضح تمامًا لمحاربي قاعدة الكود في وقت لاحق. (استخدم صيغة الجمع لاسم الجدول).

2. تعديل الهجرة

# 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

3. قم بتشغيل هجراتك

rake db:migrate

وأنت خارج السباقات!

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

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

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

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

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. إلى هذا النوع ، يتم تشغيل طريقة UP متى 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
    

أنا على Rails 5.2 ، وأحاول إعادة تسمية عمود على مستخدم ابتكر.

ال rename_column عملت قليلا بالنسبة لي ، ولكن المفرد :table_name ألقى خطأ "جدول المستخدم غير موجود". عمل الجمع بالنسبة لي.

rails g RenameAgentinUser

ثم قم بتغيير ملف الترحيل إلى هذا:

rename_column :users, :agent?, :agent

أين: وكيل؟ هو اسم العمود القديم.

مجرد توليد الهجرة باستخدام الأمر

rails g migration rename_hased_password

بعد ذلك ، قم بتحرير الهجرة إضافة السطر التالي في طريقة التغيير

rename_column :table, :hased_password, :hashed_password

هذا ينبغي أن تفعل خدعة.

Rails 5 تغييرات الترحيل

على سبيل المثال:

Rails G نموذج الطالب student_name: سلسلة العمر: عدد صحيح

إذا كنت تريد التغيير أسم الطالب عمود اسم

ملاحظة:- إذا لم تقم بتشغيل القضبان DB: ترحيل

يمكنك القيام بالخطوات التالية

Rails d نموذج الطالب student_name: سلسلة العمر: عدد صحيح

سيؤدي ذلك إلى إزالة ملف الترحيل الذي تم إنشاؤه ، يمكنك الآن تصحيح اسم العمود الخاص بك

Rails G نموذج الطالب الاسم: سلسلة العمر: عدد صحيح

إذا قمت بالترحيل (Rails DB: Migrate) ، فإن الخيارات التالية لتغيير اسم العمود

Rails g migration removestudentNameFromStudent student_name: String

Rails G Migration Addnametostudent اسم: سلسلة

تحديث - ابن عم قريب من 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
#...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top