كيف يمكنني إعادة تسمية عمود قاعدة البيانات في ترحيل Ruby on Rails؟
-
22-09-2019 - |
سؤال
أنا أسمي بشكل خاطئ عمود 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
لديك طريقتان للقيام بذلك:
في هذا النوع ، يقوم تلقائيًا بتشغيل الرمز العكسي منه ، عند التراجع.
def change rename_column :table_name, :old_column_name, :new_column_name end
إلى هذا النوع ، يتم تشغيل طريقة 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
#...