Ruby on Rails: ฉันจะเปลี่ยนการย้ายข้อมูลด้วย rake db: migrate ได้อย่างไร


94

หลังจากติดตั้งอุปกรณ์ MODEL User ฉันได้รับสิ่งนี้

class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end

  def self.down
    drop_table :users
  end
end

ตอนนี้ถ้าฉันทำ rake db: โยกย้ายตารางผู้ใช้จะถูกสร้างขึ้น

ฉันจะยกเลิกการย้ายข้อมูลนี้ได้อย่างไรเช่นฉันจะลบตารางผู้ใช้โดยใช้คราดอีกครั้งได้อย่างไร

คำตอบ:


147

รันคำสั่งต่อไปนี้

rake db:migrate:down VERSION=<version>

ที่<version>เป็นหมายเลขรุ่นของแฟ้มการย้ายถิ่นของคุณคุณต้องการเปลี่ยนกลับ

เช่น. หากคุณต้องการเปลี่ยนกลับการย้ายข้อมูลด้วยชื่อไฟล์ 3846656238_create_users.rb

rake db: migrate: down VERSION = 3846656238


ฉันได้รับUnknownMigrationVersionErrorแต่ฉันคิดว่าเป็นเพราะการย้ายข้อมูลของฉันอยู่ข้างในมีdb/migrate/mainใครรู้วิธีแก้ปัญหาสำหรับสิ่งนี้เพื่อdb:migrate:downดูในไดเร็กทอรีเฉพาะนั้นหรือไดเร็กทอรีย่อยที่โอนย้าย
tf.rz

นี่เป็นเพียงรางที่ 3 เป็นต้นไป ชีวิตของฉันอยู่ในราง 2 เศร้าเหลือเกิน
morhook

@morhook สิ่งนี้ใช้ได้กับราง 3 ด้วย ตรวจสอบเอกสารได้ที่นี่guide.rubyonrails.org/v3.2/migrations.html
Mahesh

คุณพูดถูก! ใช้ได้กับทั้งราง 2 และราง 3 ขอบคุณ @Mahesh สำหรับข้อมูลของคุณ!
morhook


65

ฉันเชื่อว่ามีสามตัวเลือกสำหรับการเปลี่ยนกลับการย้ายข้อมูล (ยังทับซ้อนกัน):

  1. ยกเลิกการย้ายข้อมูลล่าสุด :

    rake db:migrate:down # ราง 2 เท่านั้น.

  2. ม้วนลงจำนวน (n) ของการโยกย้ายที่ผ่านมา:

    rake db:rollback STEP=n

  3. เลื่อนลงไปที่เวอร์ชันก่อนหน้าเฉพาะ :

    $ rake db:migrate:down VERSION=nnn # Rails 3 (ระบุหมายเลขเวอร์ชันด้วย)

Version Number หมายถึง SHA (Secure Hash Algorithm) สำหรับคอมมิตซึ่งเป็นเลขฐานสิบหกแบบยาวซึ่งมีลักษณะคล้ายกับ 886af3194768917c78e ... คุณสามารถดูได้โดยทำ git log

คุณสามารถดูคำสั่งเหล่านี้ (และอื่น ๆ ) พร้อมคำอธิบายได้โดยใช้rake -T db:ซึ่งสำหรับราง 3.2 ประกอบด้วย:

rake db:migrate         # Migrate the database (options: VERSION=x, VERBOSE=false)
rake db:migrate:status  # Display status of migrations
rake db:rollback        # Rolls the schema back to the previous version (specify steps w/ STEP=n)

5
กลิ้งลงไปรุ่นที่เฉพาะเจาะจง:rake db:migrate VERSION=<version number>
Ajedi32

3
อย่างน้อยสำหรับราง 3.0.20 คำสั่งแรกผิด มีการrake db:migrate:downยกเลิกเพียงครั้งเดียวพร้อมกับข้อความแสดงข้อผิดพลาด "ต้องใช้เวอร์ชัน" แนะนำ rake db:rollbackผลงานอย่างไร
martin

ตามรายละเอียดในคำตอบ Rails 2 สำหรับ commmand แรกเท่านั้น
Michael Durrant

1
ตัวแปรสภาพแวดล้อมเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่จึงควรเป็นSTEPและVERSION
Kostas Rousis

ชี้แจง$ rake db:migrate:down VERSION=nnnไม่ม้วนลงไปรุ่นก็ย้ายลงรุ่นที่ระบุ
johnml

15

คุณสามารถย้อนกลับและระบุจำนวนครั้งสุดท้ายที่จะย้อนกลับได้เช่น

rake db:rollback STEP=3

สำหรับการย้ายข้อมูล 3 ครั้งล่าสุด


นี่เป็นวิธีที่เร็วและง่ายกว่าแทนที่จะค้นหาหมายเลขเวอร์ชันหากคุณต้องการยกเลิกการย้ายข้อมูลสองสามรายการล่าสุด
ก่อนอัลฟา

11

ในฐานะโปรแกรมเมอร์ใหม่ (หรือโปรแกรมเมอร์ใหม่คนอื่น ๆ )

rake db:rollbackทำงานประมาณครึ่งหนึ่งของเวลา ฉันเริ่มที่นั่น

ถ้าไม่, rake db:migrate:down VERSION=3846656238

เสียบ VERSION สำหรับหมายเลขเวอร์ชันของไฟล์การย้ายข้อมูลที่คุณต้องการเปลี่ยนกลับ




2

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

rake db:migrate:status

หรือ

bundle exec rake db:migrate:status

จะแสดงสถานะ ID การย้ายข้อมูลชื่อการย้ายข้อมูลสำหรับการย้ายข้อมูลทั้งหมดที่เราดำเนินการก่อนหน้านี้ เลือก ID การย้ายข้อมูลของคุณ (เช่นหมายเลขเวอร์ชันของคุณ) และใส่รหัสนั้นในคำสั่งต่อไปนี้หลังจาก version = ,,, แล้วกด Enter

bundle exec rake db:migrate:down VERSION=

0

วิธีย้อนกลับการย้ายข้อมูล

(1) ระบุรหัสการย้ายข้อมูลก่อน

rake db:migrate:status

  • คัดลอกหมายเลขประจำตัวประชาชน

ระบุการย้ายข้อมูลเพื่อย้อนกลับ

(2) จากนั้นย้อนกลับการย้ายข้อมูล

rake db:migrate:down VERSION=20190802023239

  • วางหมายเลข ID ที่เกี่ยวข้องด้านบน แน่นอนว่าในกรณีของคุณ ID การย้ายข้อมูลจะแตกต่างกัน! ใช้รหัสการย้ายข้อมูลที่ถูกต้อง

....... และตอนนี้คุณกำลังออกไปแข่งขัน!

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