วิธีการวางคอลัมน์โดยใช้การโยกย้าย Rails


คำตอบ:


917
remove_column :table_name, :column_name

ตัวอย่างเช่น

remove_column :users, :hobby

จะลบคอลัมน์งานอดิเรกออกจากตารางผู้ใช้


9
และอย่าลืมทำสิ่งนี้ภายในupและdownวิธีการต่าง ๆ ไม่ใช่changeตามที่อธิบายไว้ในคำตอบของ @Powers
XåpplI'-I0llwlg'I -

7
@ XåpplI'-I0llwlg'I- ขอบคุณสำหรับความคิดเห็น วิธีการเปลี่ยนสามารถใช้เพื่อวางคอลัมน์ในแอปพลิเคชั่น Rails 4 แต่ไม่ควรใช้ใน Rails 3 ฉันอัปเดตคำตอบตามนั้น
พลัง

9
นอกจากนี้คุณยังสามารถใช้remove_column :table_name, :column_name, :type, :optionsในchangeวิธีการเพราะถ้าคุณระบุประเภทการคืนค่าการโยกย้ายเป็นไปได้ จากเอกสาร: และพารามิเตอร์จะถูกละเว้นถ้าปัจจุบัน การให้ข้อมูลเหล่านี้ในวิธีการย้ายข้อมูลอาจเป็นประโยชน์ ในกรณีนั้นและจะถูกใช้โดย add_column typeoptionschangetypeoptions
นิโคลัส

24
ใน Rails4 คุณสามารถลบคอลัมน์ในchangeเมธอดได้ แต่หากคุณระบุประเภทคอลัมน์ remove_column, :table_name, :column_name, :column_typeเช่น มิฉะนั้นคุณจะได้รับข้อผิดพลาดต่อไปนี้เมื่อพยายามเรียกใช้การย้ายข้อมูล:remove_column is only reversible if given a type
เดนนิส

5
มันอาจจะคุ้มค่าที่จะสังเกตเห็นในคำตอบหลักว่าการลบคอลัมน์จะไม่ลบดัชนีที่เกี่ยวข้องหากมีอยู่
sameers

371

สำหรับ Rails รุ่นเก่า

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

สำหรับ Rails 3 ขึ้นไป

rails generate migration RemoveFieldNameFromTableName field_name:datatype

18
"rails g" สามารถใช้เป็นทางเลือกแทน "rails generate"
Noz

44
rails g migration remove_field_name_from_table_name field_name:datatypeยังใช้ได้
Stuart Nelson

6
ยังทราบว่าอาจจะตามด้วยรายการสีขาวระยะห่างของ filed_name: data_type และ add_column และ remove_column งบที่เหมาะสมจะได้รับการสร้าง: เอาสองคุณลักษณะโดยใช้การโยกย้ายเดียว ยังทราบว่าจะไม่ได้รับการสนับสนุนโดยวิธีการเพื่อให้คุณมีการเขียนทั้งสองและ AddXXXtoTTTRemoveXXXFromTTTrails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integerremove_columnchangeupdown
Claudio Floreani

3
Rails 4 ดูเหมือนจะสนับสนุนchangeสิ่งนี้ การย้อนกลับทำงานได้ตามที่ควร
Unknown_Guy

2
@AdamGrant ฉันคิดว่าถ้าคุณใช้changeวิธีการที่สามารถเปลี่ยนกลับได้ *คุณจะต้องแจ้งประเภทข้อมูล (และตัวดัดแปลงฟิลด์อื่น ๆ ทั้งหมด) ดังนั้นหากคุณย้อนกลับการโยกย้ายนั้นฟิลด์นั้นจะสามารถสร้างใหม่ได้อย่างถูกต้อง * เมื่อฉันบอกว่าย้อนกลับนั่นคือในแง่ของโครงสร้างฐานข้อมูลแน่นอนข้อมูลจากคอลัมน์นั้นจะหายไปอย่างชัดเจน
RFVoltolini

117

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 ดังนั้นคุณจะไม่สามารถย้อนกลับการโยกย้ายนี้ได้


3
จากนั้นเรียกใช้ rake db: migrate
roxdurazo

1
@Powers - คำตอบที่ยอดเยี่ยมและชัดเจน - คุณจะสามารถอธิบายรายละเอียดต่อไปนี้ได้อย่างไร: "วิธีการเปลี่ยนใน Rails 3 ไม่ฉลาดเมื่อพูดถึง remove_column ดังนั้นคุณจะไม่สามารถย้อนกลับการโยกย้ายนี้ได้"
BKSpurgeon

1
@BKSpurgeon - ใน Rails 3 หากคุณใช้changeเมธอดrake db:rollbackคำสั่งจะเกิดข้อผิดพลาด เป็นพื้นตรงข้ามของrake db:rollback rake db:migrateข้อผิดพลาดนี้ได้รับการแก้ไขใน Rails 4 :)
พลัง

2
ใน Rails 4 ฉันพยายามย้อนกลับคอลัมน์การเปลี่ยนแปลง มันล้มเหลวและระบุว่าคุณต้องระบุ data_type (ตามรหัสลงในคำตอบของคุณ)
rmcsharry

1
ปัญหาเดียวกันเกิดขึ้นกับฉันเป็น @rmcsharry รุ่น Rails ของฉันคือ 4.2.2 และฉันใช้วิธีการเปลี่ยน เมื่อฉันพยายามที่จะย้อนกลับข้อผิดพลาดเกิดขึ้นที่ remove_column จะย้อนกลับได้ก็ต่อเมื่อได้รับประเภท
M. Habib

38

ในแอพพลิเคชั่น Rails4 เป็นไปได้ที่จะใช้วิธีการเปลี่ยนสำหรับลบคอลัมน์ด้วย พารามิเตอร์ที่สามคือ data_type และในตัวเลือกเพิ่มเติมคุณสามารถกำหนดตัวเลือกได้ มันเป็นบิตที่ซ่อนอยู่ในส่วน 'แปลงที่มีอยู่บนเอกสาร

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

27

มีสองวิธีที่ดีในการทำเช่นนี้:

remove_column

คุณสามารถใช้ remove_column ได้เช่น:

remove_column :users, :first_name

นี่เป็นเรื่องปกติถ้าคุณต้องการเปลี่ยนแปลงสคีมาของคุณเพียงครั้งเดียว

change_table block

นอกจากนี้คุณยังสามารถทำได้โดยใช้บล็อก change_table เช่น:

change_table :users do |t|
  t.remove :first_name
end

ฉันชอบสิ่งนี้เพราะฉันเห็นว่าอ่านง่ายขึ้นและคุณสามารถทำการเปลี่ยนแปลงหลายอย่างพร้อมกันได้

นี่คือรายการทั้งหมดของเมธอด change_table ที่สนับสนุน:

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


15

ใน 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

14

สร้างการโยกย้ายเพื่อลบคอลัมน์ดังกล่าวว่าหากมีการอพยพ ( rake db:migrate) ก็ควรลดลงคอลัมน์ และควรเพิ่มคอลัมน์กลับหากการโยกย้ายนี้ย้อนกลับ ( rake db:rollback)

ไวยากรณ์:

remove_column: table_name,: column_name,: type

ลบคอลัมน์รวมทั้งเพิ่มคอลัมน์กลับหากการโยกย้ายถูกย้อนกลับ

ตัวอย่าง:

remove_column :users, :last_name, :string

หมายเหตุ : หากคุณข้าม data_typeการโยกย้ายจะลบคอลัมน์สำเร็จ แต่ถ้าคุณย้อนกลับการโยกย้ายก็จะเกิดข้อผิดพลาด


13

คำแนะนำที่ชัดเจนและง่ายสำหรับ Rails 5.2

  • คำเตือน: คุณจะสูญเสียข้อมูลหากคุณลบคอลัมน์จากฐานข้อมูลของคุณ หากต้องการดำเนินการต่อโปรดดูด้านล่าง:
  • คำเตือน: คำแนะนำด้านล่างนี้สำหรับการย้ายข้อมูลเล็ก สำหรับการโยกย้ายที่ซับซ้อนที่มีแถวเช่นล้านแถวและล้านแถวคุณจะต้องคำนึงถึงความเป็นไปได้ของความล้มเหลวคุณจะต้องพิจารณาวิธีเพิ่มประสิทธิภาพการย้ายข้อมูลของคุณเพื่อให้ทำงานได้อย่างรวดเร็วและเป็นไปได้ที่ผู้ใช้จะใช้แอปของคุณ กระบวนการโยกย้ายเกิดขึ้น หากคุณมีฐานข้อมูลหลายตัวหรือหากมีอะไรซับซ้อนจากระยะไกลก็อย่าโทษฉันถ้ามีอะไรผิดพลาด!

1. สร้างการย้ายข้อมูล

เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลของคุณ:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

หมายเหตุ: ชื่อตารางควรอยู่ในรูปแบบพหูพจน์ตามแบบแผนทางรถไฟ

ตัวอย่าง:

ในกรณีของฉันฉันต้องการลบacceptedคอลัมน์ (ค่าบูลีน) จากquotesตาราง:

rails g migration RemoveAcceptedFromQuotes accepted:boolean

ดูเอกสารประกอบเรื่องการประชุมเมื่อมีการเพิ่ม / ลบฟิลด์ในตาราง:

มีทางลัด syntactic พิเศษเพื่อสร้างการโยกย้ายที่เพิ่มเขตข้อมูลลงในตาราง

รางสร้างการโยกย้าย add_fieldname_to_tablename fieldname: fieldtype

2. ตรวจสอบการโยกย้าย

# 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

3. เรียกใช้การโยกย้าย

rake db:migrate

.... แล้วคุณจะออกไปแข่ง!


ตอนนี้การย้ายข้อมูลสามารถเรียกใช้เป็นrails db:migrate
Imran Ali

12

ลบคอลัมน์สำหรับแอพ 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

ฉันยังทำคู่มืออ้างอิงอย่างรวดเร็วสำหรับทางรถไฟซึ่งสามารถพบได้ที่นี่



10
rails g migration RemoveXColumnFromY column_name:data_type

X = ชื่อคอลัมน์
Y = ชื่อตาราง

แก้ไข

เปลี่ยนแปลงRemoveXColumnToYไปRemoveXColumnFromYตามความเห็น - ให้ความคมชัดมากขึ้นสำหรับสิ่งที่การโยกย้ายเป็นจริงทำ


3
"เอาคอลัมน์ที่จะตาราง" เสียงแปลกดังนั้นจากที่น่าจะเป็นทางเลือกที่ดีที่นี่
เซบาสเตียนเมียร์เมียร์

@SebastianvomMeer ใช่ฉันเห็นด้วย - ภาษาอังกฤษอ่านดีขึ้นมากด้วย 'จาก'
BKSpurgeon

8

ในการลบคอลัมน์ออกจากตารางคุณต้องเรียกใช้การโยกย้ายดังต่อไปนี้:

rails g migration remove_column_name_from_table_name column_name:data_type

จากนั้นเรียกใช้คำสั่ง:

rake db:migrate

5

ให้คำสั่งด้านล่างมันจะเพิ่มในไฟล์การโยกย้ายด้วยตัวเอง

rails g migration RemoveColumnFromModel

หลังจากรันคำสั่งด้านบนแล้วคุณสามารถตรวจสอบไฟล์การย้ายได้โดยต้องเพิ่มโค้ด remove_column ด้วยตนเอง

จากนั้นโอนย้ายฐานข้อมูล

rake db:migrate


5

สำหรับการลบคอลัมน์ออกจากตารางใน 3 ขั้นตอนง่าย ๆ ดังนี้:

  1. เขียนคำสั่งนี้

rails g migration remove_column_from_table_name

หลังจากรันคำสั่งนี้ในเทอร์มินัลไฟล์เดียวที่สร้างโดยชื่อและการประทับเวลานี้ (remove_column from_table_name)

จากนั้นไปที่ไฟล์นี้

  1. ภายในไฟล์คุณต้องเขียน

    remove_column :table_name, :column_name

  2. ในที่สุดก็ไปที่คอนโซลแล้วทำ

    rake db:migrate



1

ผ่าน
remove_column :table_name, :column_name
ในไฟล์การโยกย้าย

คุณสามารถลบคอลัมน์ในคอนโซลทางรถไฟได้โดยตรงโดยพิมพ์:
ActiveRecord::Base.remove_column :table_name, :column_name


1

ทำเช่นนี้

rails g migration RemoveColumnNameFromTables column_name:type

กล่าวคือ rails g migration RemoveTitleFromPosts title:string

อย่างไรก็ตามควรพิจารณาเกี่ยวกับการหยุดทำงานด้วยเช่นกันเนื่องจาก ActiveRecord แคชคอลัมน์ฐานข้อมูลที่รันไทม์ดังนั้นหากคุณวางคอลัมน์อาจทำให้เกิดข้อยกเว้นจนกว่าแอปของคุณจะรีบูต

Ref: การโยกย้ายที่แข็งแกร่ง


1

เพียงแค่คุณสามารถลบคอลัมน์

remove_column :table_name, :column_name

ตัวอย่างเช่น,

remove_column :posts, :comment

1

ก่อนอื่นให้ลองสร้างไฟล์การย้ายข้อมูลโดยเรียกใช้คำสั่ง:

rails g migration RemoveAgeFromUsers age:string

จากนั้นในไดเรกทอรีรากของโครงการให้เรียกใช้การย้ายข้อมูลโดยเรียกใช้คำสั่ง:

rails db:migrate
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.