วิธีลบไฟล์การโอนย้ายใน Rails 3


109

ฉันต้องการลบ / ลบไฟล์การย้ายข้อมูล ฉันจะทำอย่างนั้นได้อย่างไร? ฉันรู้ว่ามีคำถามคล้าย ๆ กันที่นี่ แต่เป็นการอัปเดตมีวิธีที่ดีกว่าการทำสคริปต์ / ทำลายหรือไม่?

นอกจากนี้ฉันควรทำdb:resetหรือdb:dropถ้าฉันลบ / ลบการย้ายข้อมูล?

คำตอบ:


142

ฉันมัก:

  1. ดำเนินการrake db:migrate VERSION=XXXกับสภาพแวดล้อมทั้งหมดเป็นเวอร์ชันก่อนที่ฉันต้องการลบ
  2. ลบไฟล์การย้ายด้วยตนเอง
  3. หากมีการย้ายข้อมูลที่รอดำเนินการ (กล่าวคือการย้ายข้อมูลที่ฉันนำออกไม่ใช่ครั้งสุดท้าย) ฉันจะดำเนินการใหม่rake db:migrateอีกครั้ง

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

ข้อมูลอ้างอิงที่ดีอีกประการหนึ่งสำหรับการย้ายข้อมูลคือhttp://guides.rubyonrails.org/migrations.html


2
การลบการย้ายข้อมูลแล้วเรียกใช้ db: migrate จะล้างตารางที่สร้างขึ้นหรือไม่
alvincrespo

2
ไม่เนื่องจาก Rails ไม่รู้ว่าจะลบมันอย่างไร จำเป็นต้องเรียกself.downวิธีการที่กำหนดไว้ในการย้ายข้อมูลของคุณเพื่อ "ปรับลดรุ่น" ฐานข้อมูลของคุณ
Fábio Batista

35
หากคุณลบไฟล์ไปแล้วโดยไม่ทราบว่ารางจะไม่ยอมปล่อยง่ายๆrake db:migrate:statusจะแสดง ID ของไฟล์ที่หายไปซึ่งคุณสามารถใช้เพื่อสร้างไฟล์ใหม่ได้ เมื่อกลับมาแล้วคุณสามารถทำตามคำแนะนำของคำตอบนี้เพื่อชัยชนะ
Jordan Feldstein

1
@JordanFeldstein ขอบคุณครับ db:migrate:statusเป็นการช่วยชีวิต!
dee

1
@Lucas เมื่อลบไฟล์การโอนย้ายแล้วจะไม่สามารถย้อนกลับได้อีกต่อไป นั่นเป็นเหตุผลที่คุณต้องเปลี่ยนกลับในสภาพแวดล้อมทั้งหมดที่รันอยู่แล้ว (การผลิตการพัฒนาการทดสอบการจัดเตรียม ฯลฯ ) ก่อนที่จะลบไฟล์ นั่นเป็นเหตุผลที่ฉันเขียนว่าการสร้างการย้ายข้อมูลอีกครั้งเพื่อย้อนกลับไปใช้งานจริงนั้นปลอดภัยกว่าเมื่อดำเนินการผลิตแล้ว
Fábio Batista

68

อีกวิธีในการลบการย้าย:

$ rails d migration SameMigrationNameAsUsedToGenerate

ใช้ก่อนที่rake db:migrateจะดำเนินการเนื่องจากการเปลี่ยนแปลงในฐานข้อมูลจะคงอยู่ตลอดไป :) - หรือลบการเปลี่ยนแปลงด้วยตนเอง


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

8
อย่างไรก็ตาม "d" ย่อมาจาก "destroy"
Greg M. Krsak

21

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

  1. rake db:migrate:down VERSION="20140311142212" (เวอร์ชันที่นี่คือการประทับเวลาที่อยู่ข้างหน้ารางเมื่อสร้างการย้ายข้อมูลการดำเนินการนี้จะเปลี่ยนกลับฐานข้อมูลเนื่องจากการย้ายข้อมูลนี้)

  2. Run "rails destroy migration migration_name"(migration_name เป็นชื่อที่เลือกใช้ในขณะสร้างการย้ายข้อมูลโปรดลบ " timestamp_ " ออกจากชื่อไฟล์การย้ายข้อมูลของคุณเพื่อรับ)


คราดทำลายการโยกย้าย AddFileToTable คราดยกเลิก! ไม่รู้วิธีสร้างงาน 'ทำลาย' (ดูการติดตามแบบเต็มโดยการรันงานด้วย --trace)
sadaf2605

3
สำหรับ # 2 คำสั่งที่ถูกต้องคือ:rails d migration migration_name
mauriciomdea

1
ขอบคุณสำหรับคำใบ้ "ลบ timestamp_" นั่นคือสิ่งที่ฉันต้องการ
LightMan

10

คุณสามารถเรียกใช้การย้ายข้อมูลลงได้เช่นนี้:

rake db:migrate:down VERSION=versionnumber

ดูคู่มือRuby on Railsเกี่ยวกับการย้ายข้อมูลสำหรับข้อมูลเพิ่มเติม


9

เราสามารถใช้,

$ rails d migration table_name  

ซึ่งจะลบการย้ายข้อมูล


1
ฉันคิดว่ามันควรเป็นชื่อรุ่นมากกว่า table_name
Ajeet Khan

3

บางครั้งฉันพบว่าตัวเองกำลังลบไฟล์การย้ายข้อมูลและลบรายการที่เกี่ยวข้องในตาราง schema_migrations ออกจากฐานข้อมูล ไม่สวย แต่ใช้งานได้


3

นอกจากนี้ยังใช้งานได้ใน Rails 5

หากการย้ายข้อมูลเป็นรายการล่าสุดคุณสามารถลบคอลัมน์ฐานข้อมูลที่การย้ายข้อมูลเพิ่มโดยทำ:

rake db:rollback

จากนั้นลบไฟล์การย้ายข้อมูลโดยเรียกใช้:

rails d migration WhateverYourMigrationWasNamed.rb 


1

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

rails db:migrate:status

สังเกตเวอร์ชันของการย้ายข้อมูลที่ขาดหายไปและเข้าไปที่คอนโซล db:

rails dbconsole

ตอนนี้ลบเวอร์ชันออกจากตารางการย้ายด้วยตนเอง:

delete from schema_migrations where version='<version>';

ตอนนี้คุณควรจะดี


0

ฉันเพิ่งมีปัญหาเดียวกันนี้:

  1. ราง d การโอนย้าย fuu - ลบการย้ายข้อมูลด้วยการประทับเวลาล่าสุด
  2. ราง d การโยกย้าย fuu - ลบการย้ายข้อมูลอื่น ๆ
  3. ใช้สถานะคอมไพล์เพื่อตรวจสอบว่าไม่ได้อยู่ในไฟล์ที่ไม่ได้ติดตามอีกต่อไป
  4. ราง g การโยกย้าย fuu

ที่แก้ไขให้ฉัน


0

หมายเหตุด้านข้าง: เริ่มต้นที่ราง 5.0.0 rakeถูกเปลี่ยนเป็นrails ดังนั้นให้ดำเนินการดังต่อไปนี้

ราง db: โยกย้าย VERSION = 0

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