Ruby on Rails: Làm cách nào để hoàn nguyên quá trình di chuyển với rake db: migrate?


94

Sau khi cài đặt người dùng devise MODEL, tôi có cái này.

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

Bây giờ nếu tôi thực hiện rake db: di chuyển bảng người dùng sẽ được tạo.

Làm cách nào để hoàn nguyên việc di chuyển này, tức là làm cách nào để xóa lại bảng người dùng bằng cách sử dụng rake?

Câu trả lời:


147

Chạy lệnh sau

rake db:migrate:down VERSION=<version>

đâu <version>là số phiên bản của tệp di chuyển mà bạn muốn hoàn nguyên.

ví dụ. nếu bạn muốn hoàn nguyên quá trình di chuyển với tên tệp 3846656238_create_users.rb

rake db: migrate: down VERSION = 3846656238


Tôi nhận được một UnknownMigrationVersionErrornhưng tôi đã phát hiện ra đó là do quá trình di chuyển của tôi đang ở bên trong db/migrate/main, có ai biết giải pháp cho việc này để db:migrate:downxem bên trong thư mục cụ thể đó hoặc các thư mục con di chuyển không?
tf.rz

Điều này chỉ dành cho đường ray 3 trở đi. Cuộc sống của tôi đang ở trong đường ray 2. Thật buồn
morhook

@morhook Điều này cũng hoạt động cho đường ray 3. Kiểm tra tài liệu tại đây guide.rubyonrails.org/v3.2/migrations.html
Mahesh

Bạn đúng rồi! Nó hoạt động cho cả đường ray 2 và đường ray 3. Cảm ơn @Mahesh đã đóng góp ý kiến!
morhook


65

Tôi tin rằng có ba tùy chọn có sẵn để hoàn nguyên di chuyển (chúng cũng trùng lặp):

  1. Cuộn xuống lần di chuyển gần đây nhất :

    rake db:migrate:down # Chỉ đường ray 2.

  2. Cuộn xuống một số (n) lần di chuyển gần đây:

    rake db:rollback STEP=n

  3. Cuộn xuống để một, trước cụ thể phiên bản:

    $ rake db:migrate:down VERSION=nnn # Rails 3 (cung cấp cả số phiên bản).

Số phiên bản có nghĩa là SHA (Thuật toán băm an toàn) cho cam kết là một số thập lục phân dài trông giống như 886af3194768917c78e ... Bạn có thể thấy nó bằng cách thực hiện git log

Bạn có thể xem các lệnh này (và những lệnh khác) với mô tả của chúng bằng cách sử dụng rake -T db:nó cho rails 3.2 bao gồm:

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
Lăn xuống đến một phiên bản cụ thể:rake db:migrate VERSION=<version number>
Ajedi32

3
Ít nhất đối với rails 3.0.20, lệnh đầu tiên là sai. Một lần rake db:migrate:downhủy bỏ với thông báo lỗi "VERSION là bắt buộc". Các khuyến cáo rake db:rollback tuy nhiên hoạt động.
martin

Như chi tiết trong câu trả lời, Rails 2 CHỈ cho lệnh đầu tiên.
Michael Durrant

1
Biến môi trường là trường hợp nhạy cảm vì vậy nó phải STEPVERSION
Kostas Rousis

Để làm rõ, $ rake db:migrate:down VERSION=nnnkhông lăn xuống đến một phiên bản, nó di chuyển xuống các phiên bản cụ thể.
johnml

15

Bạn có thể thực hiện khôi phục và chỉ định số lần di chuyển cuối cùng sẽ được khôi phục, ví dụ:

rake db:rollback STEP=3

cho 3 lần di cư cuối cùng.


đây là một cách nhanh hơn và dễ dàng hơn, thay vì tra cứu số phiên bản nếu bạn muốn hoàn tác một vài lần di chuyển cuối cùng
Pre-alpha,

11

Là một lập trình viên mới (hoặc các lập trình viên mới khác)

rake db:rollbackhoạt động khoảng một nửa thời gian. Tôi bắt đầu ở đó.

Nếu không, rake db:migrate:down VERSION=3846656238

cắm VERSION cho số phiên bản của tệp di chuyển mà bạn muốn hoàn nguyên.


10
rake db:migrate:redo

Nó sẽ hoàn tác và áp dụng lại lần di chuyển cuối cùng.


5

Đối với đường ray 5, chúng ta có thể sử dụng rails command instead of rake

rails db:migrate:down VERSION=<version>

thí dụ

rails db: migrate: down VERSION = 20170330090327


2

Chạy lệnh này trong thiết bị đầu cuối của bạn:

rake db:migrate:status

hoặc là

bundle exec rake db:migrate:status

Nó hiển thị trạng thái, ID di chuyển, tên di chuyển cho tất cả di chuyển mà chúng tôi đã chạy trước đó. chọn id di chuyển của bạn (tức là số phiên bản của bạn) và đặt id đó vào lệnh sau sau phiên bản = ,,, và nhấn enter

bundle exec rake db:migrate:down VERSION=

0

Cách khôi phục quá trình di chuyển

(1) Xác định đầu tiên ID di chuyển

rake db:migrate:status

  • Sao chép số ID.

Xác định quá trình di chuyển để quay trở lại.

(2) Sau đó, khôi phục quá trình di chuyển

rake db:migrate:down VERSION=20190802023239

  • Dán số ID có liên quan ở trên. Tất nhiên, trong trường hợp của bạn, ID di chuyển sẽ khác! Sử dụng đúng ID di chuyển.

....... và bây giờ bạn đang tham gia các cuộc đua!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.