ไวยากรณ์สำหรับการทิ้งคอลัมน์ตารางฐานข้อมูลผ่านการโยกย้าย Rails คืออะไร
ไวยากรณ์สำหรับการทิ้งคอลัมน์ตารางฐานข้อมูลผ่านการโยกย้าย Rails คืออะไร
คำตอบ:
remove_column :table_name, :column_name
ตัวอย่างเช่น
remove_column :users, :hobby
จะลบคอลัมน์งานอดิเรกออกจากตารางผู้ใช้
remove_column :table_name, :column_name, :type, :options
ในchange
วิธีการเพราะถ้าคุณระบุประเภทการคืนค่าการโยกย้ายเป็นไปได้ จากเอกสาร: และพารามิเตอร์จะถูกละเว้นถ้าปัจจุบัน การให้ข้อมูลเหล่านี้ในวิธีการย้ายข้อมูลอาจเป็นประโยชน์ ในกรณีนั้นและจะถูกใช้โดย add_column type
options
change
type
options
change
เมธอดได้ แต่หากคุณระบุประเภทคอลัมน์ remove_column, :table_name, :column_name, :column_type
เช่น มิฉะนั้นคุณจะได้รับข้อผิดพลาดต่อไปนี้เมื่อพยายามเรียกใช้การย้ายข้อมูล:remove_column is only reversible if given a type
สำหรับ Rails รุ่นเก่า
ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype
สำหรับ Rails 3 ขึ้นไป
rails generate migration RemoveFieldNameFromTableName field_name:datatype
rails g migration remove_field_name_from_table_name field_name:datatype
ยังใช้ได้
AddXXXtoTTT
RemoveXXXFromTTT
rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integer
remove_column
change
up
down
change
สิ่งนี้ การย้อนกลับทำงานได้ตามที่ควร
change
วิธีการที่สามารถเปลี่ยนกลับได้ *คุณจะต้องแจ้งประเภทข้อมูล (และตัวดัดแปลงฟิลด์อื่น ๆ ทั้งหมด) ดังนั้นหากคุณย้อนกลับการโยกย้ายนั้นฟิลด์นั้นจะสามารถสร้างใหม่ได้อย่างถูกต้อง * เมื่อฉันบอกว่าย้อนกลับนั่นคือในแง่ของโครงสร้างฐานข้อมูลแน่นอนข้อมูลจากคอลัมน์นั้นจะหายไปอย่างชัดเจน
Rails 4 ได้รับการปรับปรุงดังนั้นวิธีการเปลี่ยนสามารถใช้ในการย้ายข้อมูลเพื่อปล่อยคอลัมน์และการย้ายข้อมูลจะย้อนกลับได้สำเร็จ โปรดอ่านคำเตือนต่อไปนี้สำหรับแอปพลิเคชั่น Rails 3:
คำเตือน Rails 3
โปรดทราบว่าเมื่อคุณใช้คำสั่งนี้:
rails generate migration RemoveFieldNameFromTableName field_name:datatype
การย้ายข้อมูลที่สร้างจะมีลักษณะดังนี้:
def up
remove_column :table_name, :field_name
end
def down
add_column :table_name, :field_name, :datatype
end
อย่าใช้วิธีการเปลี่ยนแปลงเมื่อลบคอลัมน์ออกจากตารางฐานข้อมูล (ตัวอย่างสิ่งที่คุณไม่ต้องการในไฟล์การโยกย้ายในแอพ Rails 3):
def change
remove_column :table_name, :field_name
end
วิธีการเปลี่ยนใน Rails 3 ไม่ได้ฉลาดเมื่อพูดถึง remove_column ดังนั้นคุณจะไม่สามารถย้อนกลับการโยกย้ายนี้ได้
change
เมธอดrake db:rollback
คำสั่งจะเกิดข้อผิดพลาด เป็นพื้นตรงข้ามของrake db:rollback
rake db:migrate
ข้อผิดพลาดนี้ได้รับการแก้ไขใน Rails 4 :)
ในแอพพลิเคชั่น Rails4 เป็นไปได้ที่จะใช้วิธีการเปลี่ยนสำหรับลบคอลัมน์ด้วย พารามิเตอร์ที่สามคือ data_type และในตัวเลือกเพิ่มเติมคุณสามารถกำหนดตัวเลือกได้ มันเป็นบิตที่ซ่อนอยู่ในส่วน 'แปลงที่มีอยู่บนเอกสาร
class RemoveFieldFromTableName < ActiveRecord::Migration
def change
remove_column :table_name, :field_name, :data_type, {}
end
end
มีสองวิธีที่ดีในการทำเช่นนี้:
คุณสามารถใช้ remove_column ได้เช่น:
remove_column :users, :first_name
นี่เป็นเรื่องปกติถ้าคุณต้องการเปลี่ยนแปลงสคีมาของคุณเพียงครั้งเดียว
นอกจากนี้คุณยังสามารถทำได้โดยใช้บล็อก change_table เช่น:
change_table :users do |t|
t.remove :first_name
end
ฉันชอบสิ่งนี้เพราะฉันเห็นว่าอ่านง่ายขึ้นและคุณสามารถทำการเปลี่ยนแปลงหลายอย่างพร้อมกันได้
นี่คือรายการทั้งหมดของเมธอด change_table ที่สนับสนุน:
http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table
ใน Rails 5 คุณสามารถใช้คำสั่งนี้ใน terminal:
rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE
ตัวอย่างเช่นการลบคอลัมน์ access_level (สตริง) ออกจากผู้ใช้ตาราง:
rails generate migration remove_access_level_from_users access_level:string
จากนั้นเรียกใช้:
rake db:migrate
สร้างการโยกย้ายเพื่อลบคอลัมน์ดังกล่าวว่าหากมีการอพยพ ( rake db:migrate
) ก็ควรลดลงคอลัมน์ และควรเพิ่มคอลัมน์กลับหากการโยกย้ายนี้ย้อนกลับ ( rake db:rollback
)
ไวยากรณ์:
remove_column: table_name,: column_name,: type
ลบคอลัมน์รวมทั้งเพิ่มคอลัมน์กลับหากการโยกย้ายถูกย้อนกลับ
ตัวอย่าง:
remove_column :users, :last_name, :string
หมายเหตุ : หากคุณข้าม data_typeการโยกย้ายจะลบคอลัมน์สำเร็จ แต่ถ้าคุณย้อนกลับการโยกย้ายก็จะเกิดข้อผิดพลาด
เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลของคุณ:
rails generate migration remove_fieldname_from_tablename fieldname:fieldtype
หมายเหตุ: ชื่อตารางควรอยู่ในรูปแบบพหูพจน์ตามแบบแผนทางรถไฟ
ตัวอย่าง:
ในกรณีของฉันฉันต้องการลบaccepted
คอลัมน์ (ค่าบูลีน) จากquotes
ตาราง:
rails g migration RemoveAcceptedFromQuotes accepted:boolean
ดูเอกสารประกอบเรื่องการประชุมเมื่อมีการเพิ่ม / ลบฟิลด์ในตาราง:
มีทางลัด syntactic พิเศษเพื่อสร้างการโยกย้ายที่เพิ่มเขตข้อมูลลงในตาราง
รางสร้างการโยกย้าย add_fieldname_to_tablename fieldname: fieldtype
# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
# with rails 5.2 you don't need to add a separate "up" and "down" method.
def change
remove_column :quotes, :accepted, :boolean
end
end
rake db:migrate
.... แล้วคุณจะออกไปแข่ง!
rails db:migrate
ลบคอลัมน์สำหรับแอพ RAILS 5
rails g migration Remove<Anything>From<TableName> [columnName:type]
คำสั่งด้านบนสร้างไฟล์การโยกย้ายภายในdb/migrate
ไดเรกทอรี ส่วนย่อยเป็นหนึ่งในคอลัมน์ลบออกจากตัวอย่างตารางที่สร้างโดยเครื่องกำเนิดไฟฟ้า Rails
class RemoveAgeFromUsers < ActiveRecord::Migration
def up
remove_column :users, :age
end
def down
add_column :users, :age, :integer
end
end
ฉันยังทำคู่มืออ้างอิงอย่างรวดเร็วสำหรับทางรถไฟซึ่งสามารถพบได้ที่นี่
rails g migration RemoveXColumnFromY column_name:data_type
X = ชื่อคอลัมน์
Y = ชื่อตาราง
แก้ไข
เปลี่ยนแปลงRemoveXColumnToY
ไปRemoveXColumnFromY
ตามความเห็น - ให้ความคมชัดมากขึ้นสำหรับสิ่งที่การโยกย้ายเป็นจริงทำ
ในการลบคอลัมน์ออกจากตารางคุณต้องเรียกใช้การโยกย้ายดังต่อไปนี้:
rails g migration remove_column_name_from_table_name column_name:data_type
จากนั้นเรียกใช้คำสั่ง:
rake db:migrate
ให้คำสั่งด้านล่างมันจะเพิ่มในไฟล์การโยกย้ายด้วยตัวเอง
rails g migration RemoveColumnFromModel
หลังจากรันคำสั่งด้านบนแล้วคุณสามารถตรวจสอบไฟล์การย้ายได้โดยต้องเพิ่มโค้ด remove_column ด้วยตนเอง
จากนั้นโอนย้ายฐานข้อมูล
rake db:migrate
remove_column
ในchange
วิธีการจะช่วยให้คุณลบคอลัมน์ออกจากตาราง
class RemoveColumn < ActiveRecord::Migration
def change
remove_column :table_name, :column_name, :data_type
end
end
ไปที่ลิงค์นี้เพื่อการอ้างอิงที่สมบูรณ์: http://guides.rubyonrails.org/active_record_migrations.html
สำหรับการลบคอลัมน์ออกจากตารางใน 3 ขั้นตอนง่าย ๆ ดังนี้:
rails g migration remove_column_from_table_name
หลังจากรันคำสั่งนี้ในเทอร์มินัลไฟล์เดียวที่สร้างโดยชื่อและการประทับเวลานี้ (remove_column from_table_name)
จากนั้นไปที่ไฟล์นี้
ภายในไฟล์คุณต้องเขียน
remove_column :table_name, :column_name
ในที่สุดก็ไปที่คอนโซลแล้วทำ
rake db:migrate
มีอีกหนึ่งรายการจากคอนโซลของราง
ActiveRecord::Migration.remove_column(:table_name, :column_name)
ผ่าน
remove_column :table_name, :column_name
ในไฟล์การโยกย้าย
คุณสามารถลบคอลัมน์ในคอนโซลทางรถไฟได้โดยตรงโดยพิมพ์:
ActiveRecord::Base.remove_column :table_name, :column_name
ทำเช่นนี้
rails g migration RemoveColumnNameFromTables column_name:type
กล่าวคือ rails g migration RemoveTitleFromPosts title:string
อย่างไรก็ตามควรพิจารณาเกี่ยวกับการหยุดทำงานด้วยเช่นกันเนื่องจาก ActiveRecord แคชคอลัมน์ฐานข้อมูลที่รันไทม์ดังนั้นหากคุณวางคอลัมน์อาจทำให้เกิดข้อยกเว้นจนกว่าแอปของคุณจะรีบูต
Ref: การโยกย้ายที่แข็งแกร่ง
เพียงแค่คุณสามารถลบคอลัมน์
remove_column :table_name, :column_name
ตัวอย่างเช่น,
remove_column :posts, :comment
ก่อนอื่นให้ลองสร้างไฟล์การย้ายข้อมูลโดยเรียกใช้คำสั่ง:
rails g migration RemoveAgeFromUsers age:string
จากนั้นในไดเรกทอรีรากของโครงการให้เรียกใช้การย้ายข้อมูลโดยเรียกใช้คำสั่ง:
rails db:migrate
up
และdown
วิธีการต่าง ๆ ไม่ใช่change
ตามที่อธิบายไว้ในคำตอบของ @Powers