ฉันผิดชื่อคอลัมน์แทน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
สำหรับ Rails 3.1 ให้ใช้:
ในขณะที่วิธีการup
และdown
วิธีการยังคงใช้อยู่ Rails 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
เพื่อรักษาสิ่งที่ neater เล็กน้อย:
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
เป็นเรื่องปกติหรือเรื่องเกี่ยวกับธุรกิจของคุณ
สำหรับ Rails 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
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
จาก 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
สำหรับข้อมูลเพิ่มเติมคุณสามารถย้าย: Ruby on Rails - โยกย้ายหรือใช้งาน Migrations
หากรหัสของคุณไม่ได้ใช้ร่วมกันกับคนอื่น ๆ แล้วเลือกที่ดีที่สุดคือการไม่เพียงแค่นั้นแก้ไขชื่อคอลัมน์ของคุณในการย้ายถิ่นและ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!ที่ด้านล่างของ model.rb ของคุณ) และวิโอลา! ฐานข้อมูลอัพเดทได้ทันที
https://github.com/DAddYE/mini_record
หมายเหตุ: คุณจะต้อง nuke db / schema.rbเพื่อป้องกันความขัดแย้ง
ยังอยู่ในช่วงเบต้าและไม่ชัดเจนสำหรับทุกคน แต่ก็ยังเป็นตัวเลือกที่น่าสนใจ (ขณะนี้ฉันกำลังใช้งานอยู่ในสองแอพพลิเคชั่นที่ไม่สำคัญโดยไม่มีปัญหา)
หากคุณต้องการที่จะเปลี่ยนชื่อคอลัมน์ที่คุณจะต้องสร้างตัวยึดเพื่อหลีกเลี่ยงข้อผิดพลาดชื่อคอลัมน์ที่ซ้ำกัน นี่คือตัวอย่าง:
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
เพียงสร้างการย้ายข้อมูลใหม่และในบล็อกให้ใช้rename_column
ดังต่อไปนี้
rename_column :your_table_name, :hased_password, :hashed_password
สำหรับ Ruby on Rails 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 / xxxxxxxxxx.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 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
def change
rename_column :table_name, :old_column_name, :new_column_name
end
สร้างการโยกย้าย 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
เปิดคอนโซล 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
และรันเมธอด down เมื่อ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
ตัวแทนอยู่ที่ไหน เป็นชื่อคอลัมน์เก่า
Update - ลูกพี่ลูกน้องที่ใกล้ชิดของ create_table คือ change_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
สิ่งนี้ควรทำเคล็ดลับ
การเปลี่ยนการโยกย้าย Rails 5
เช่น:
รูปแบบทางรถไฟ g student student_name: อายุสตริง: จำนวนเต็ม
ถ้าคุณต้องการเปลี่ยนคอลัมน์student_nameเป็นชื่อ
หมายเหตุ: - หากคุณไม่ได้รันrails db: migrate
คุณสามารถทำตามขั้นตอน
Rails d model นักเรียน student_name: อายุสตริง: จำนวนเต็ม
สิ่งนี้จะลบไฟล์การย้ายข้อมูลที่สร้างขึ้นตอนนี้คุณสามารถแก้ไขชื่อคอลัมน์ได้
แบบจำลอง Rails g ชื่อนักเรียน: อายุสตริง: จำนวนเต็ม
หากคุณย้ายข้อมูล (ราง db: โยกย้าย) ตัวเลือกต่อไปนี้เพื่อเปลี่ยนชื่อคอลัมน์
rails g โยกย้าย RemoveStudentNameFromStudent student_name: string
Rails g โยกย้าย AddNameToStudent ชื่อ: สตริง
rails g migration RemoveStudentNameFromStudentS student_name:string
(นักเรียนเป็นพหูพจน์)?