Sự khác biệt giữa rake db: di chuyển db: reset và db: lược đồ: load


619

Sự khác biệt giữa rake db:migraterake db:resetkhá rõ ràng trong đầu tôi. Điều mà tôi không hiểu là rake db:schema:loadkhác với hai người trước.

Chỉ để chắc chắn rằng tôi đang ở trên cùng một trang:

  • rake db:migrate - Chạy các di chuyển chưa được chạy.
  • rake db:reset- Xóa cơ sở dữ liệu (có thể là rake db:drop+ rake db:create+ rake db:migrate) và chạy di chuyển trên cơ sở dữ liệu mới.

Xin hãy giúp để làm rõ, nếu sự hiểu biết của tôi đã đi sai.


10
rake --tasksgiúp được không?
zx1986

Bạn nên kiểm tra blog này. jacopretorius.net/2014/02/ từ
Bishisht Bhatta

Hiểu biết của bạn rake db:migratelà đúng, nhưng hiểu biết của bạn rake db:resetlà sai. Xem câu trả lời trên cùng, từ moritz.
Magne

1
BTW, tính đến Rails 5, các lệnh này có thể được gọi là rails db:migrate, rails db:reset, rails db:schema:load. Xem stackoverflow.com/questions/38403533/
Mạnh

Câu trả lời:


1303
  • db: di chuyển chạy (đơn) di chuyển chưa chạy.
  • db: tạo tạo cơ sở dữ liệu
  • db: drop xóa cơ sở dữ liệu
  • db: lược đồ: load tạo các bảng và cột trong cơ sở dữ liệu (hiện có) sau lược đồ.rb

  • db: setup hiện db: tạo, db: lược đồ: load, db: seed

  • db: reset không db: drop, db: setup
  • db: di chuyển: thiết lập lại db: drop, db: tạo, db: di chuyển

Thông thường, bạn sẽ sử dụng db: di chuyển sau khi đã thực hiện các thay đổi cho lược đồ thông qua các tệp di chuyển mới (điều này chỉ có ý nghĩa nếu đã có dữ liệu trong cơ sở dữ liệu). db: lược đồ: tải được sử dụng khi bạn thiết lập một phiên bản mới của ứng dụng.

Tôi hy vọng điều đó sẽ giúp.


CẬP NHẬT cho đường ray 3.2.12:

Tôi vừa kiểm tra nguồn và các phụ thuộc là như thế này:

  • db: tạo tạo cơ sở dữ liệu cho env hiện tại
  • db: created: all tạo cơ sở dữ liệu cho tất cả các env
  • db: drop thả cơ sở dữ liệu cho env hiện tại
  • db: drop: tất cả bỏ cơ sở dữ liệu cho tất cả các envs
  • db: di chuyển chạy di chuyển cho env hiện tại chưa chạy
  • db: di chuyển: lên chạy một di chuyển cụ thể
  • db: di chuyển: xuống cuộn lại một lần di chuyển cụ thể
  • db: di chuyển: trạng thái hiển thị trạng thái di chuyển hiện tại
  • db: rollback cuộn lại lần di chuyển cuối cùng
  • db: chuyển tiếp tiến phiên bản lược đồ hiện tại sang phiên bản tiếp theo
  • db: seed (only) chạy tệp db / seed.rb
  • db: lược đồ: tải tải lược đồ vào cơ sở dữ liệu của env hiện tại
  • db: lược đồ: kết xuất kết xuất lược đồ của env hiện tại (và dường như cũng tạo ra db)

  • db: setup chạy db: lược đồ: load, db: seed

  • db: reset chạy db: drop db: setup
  • db: di chuyển: làm lại chạy (db: di chuyển: xuống db: di chuyển: lên) hoặc (db: rollback db: di chuyển) tùy thuộc vào di chuyển được chỉ định
  • db: di chuyển: thiết lập lại chạy db: drop db: tạo db: di chuyển

Để biết thêm thông tin, vui lòng xem tại https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/database.rake (cho Rails 3.2.x) và https: // github .com / rails / rails / blob / v4.0.5 / activerecord / lib / active_record / railies / cơ sở dữ liệu.rake (cho Rails 4.0.x)


16
Đây là tập tin có câu trả lời :) - github.com/rails/rails/blob/master/activerecord/lib/
Kẻ

3
@cutation: db: setup chắc chắn không chạy db: di chuyển, bởi vì nó sẽ quá dễ vỡ để chạy tất cả các di chuyển chỉ cho một thiết lập db (đây là lược đồ.rb dành cho).
moritz

2
Tôi đang thực thi db: reset và nó đang tạo db của tôi. Tại sao nó có thể?
Alejandro Riedel

db: setup cũng chạy db:createnếu cần thiết. Ít nhất là của đường ray 4.0.2.
Dan

Rails 4 sẽ thực hiện rake db:migratekhi gọi rake db:setupnếu có các di chuyển đang chờ xử lý nhưng sẽ không thực hiện di chuyển đang chờ xử lý.
Pooyan Khosravi

24

TLD

Sử dụng

  • rake db:migrate Nếu bạn muốn thay đổi lược đồ
  • rake db:resetNếu bạn muốn loại bỏ cơ sở dữ liệu, hãy tải lại lược đồ từ schema.rbvà khởi động lại cơ sở dữ liệu
  • rake db:schema:loadNếu bạn muốn đặt lại cơ sở dữ liệu thành lược đồ như được cung cấp trong schema.rb(Điều này sẽ xóa tất cả dữ liệu)

Giải thích

rake db:schema:loadsẽ thiết lập lược đồ như được cung cấp trong schema.rbtệp. Điều này hữu ích cho việc cài đặt ứng dụng mới vì nó không mất nhiều thời gian nhưdb:migrate

Lưu ý quan trọng, db:schema:loadsẽ xóa dữ liệu trên máy chủ.

rake db:migratethực hiện thay đổi cho lược đồ hiện có. Nó giống như tạo các phiên bản của lược đồ. db:migratesẽ xem xét db/migrate/bất kỳ tệp ruby ​​nào và thực hiện các di chuyển chưa chạy bắt đầu với tệp cũ nhất. Rails biết tệp nào cũ nhất bằng cách nhìn vào dấu thời gian ở đầu tên tệp di chuyển. db:migrateđi kèm với một lợi ích là dữ liệu cũng có thể được đưa vào cơ sở dữ liệu. Đây thực sự không phải là một thực hành tốt. Nó tốt hơn để sử dụng rake db:seedđể thêm dữ liệu.

rake db:migratecung cấp các tác vụ lên , xuống , vv cho phép các lệnh như rake db:rollbackvà làm cho nó trở thành lệnh hữu ích nhất.

rake db:resetthực hiện một db:dropdb:setup
nó làm rơi cơ sở dữ liệu, tạo lại nó, tải lược đồ và khởi tạo với dữ liệu hạt giống

Một phần có liên quan của các lệnh từ cơ sở dữ liệu.rake


namespace :schema do
  desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
  task :dump => [:environment, :load_config] do
    require 'active_record/schema_dumper'
    filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
    File.open(filename, "w:utf-8") do |file|
      ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
    end
    db_namespace['schema:dump'].reenable
  end

  desc 'Loads a schema.rb file into the database'
  task :load => [:environment, :load_config, :check_protected_environments] do
    ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
  end

  # desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
  task :reset => [ 'db:drop', 'db:setup' ]

namespace :migrate do
  # desc  'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
  task :redo => [:environment, :load_config] do
    if ENV['VERSION']
      db_namespace['migrate:down'].invoke
      db_namespace['migrate:up'].invoke
    else
      db_namespace['rollback'].invoke
      db_namespace['migrate'].invoke
    end
  end

Vì vậy, nếu bạn tạo lược đồ sản xuất của mình bằng db: giản đồ: tải (được tạo từ một loạt các lần di chuyển trước đó), sẽ không biết di chuyển nào (những lần tham gia tạo lược đồ ban đầu.rb) không cần phải chạy trong tương lai Yêu cầu của db: di chuyển?
Canada

2

Theo tôi hiểu, nó sẽ bỏ cơ sở dữ liệu của bạn và tạo lại nó dựa trên db/schema.rbtệp của bạn . Đó là lý do tại sao bạn cần đảm bảo rằng schema.rbtệp của bạn luôn được cập nhật và dưới sự kiểm soát phiên bản.


0

Bạn có thể chỉ cần nhìn vào các tác vụ Active Record Rake vì đó là nơi tôi tin rằng chúng sống như trong tệp này. https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/t task / database_t Nhiệm.rb

Những gì họ làm là câu hỏi của bạn phải không?

Điều đó phụ thuộc vào nơi họ đến và đây chỉ là ví dụ để cho thấy rằng họ thay đổi tùy theo nhiệm vụ. Ở đây chúng tôi có một tập tin khác nhau đầy đủ các nhiệm vụ.

https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile

trong đó có những nhiệm vụ này.

namespace :db do
  task create: ["db:mysql:build", "db:postgresql:build"]
  task drop: ["db:mysql:drop", "db:postgresql:drop"]
end

Điều này có thể không trả lời câu hỏi của bạn nhưng có thể cung cấp cho bạn một cái nhìn sâu sắc về phía trước và xem xét nguồn đặc biệt là các tệp và nhiệm vụ cào. Vì họ làm rất tốt việc giúp bạn sử dụng đường ray nên họ không luôn luôn ghi lại mã đó. Tất cả chúng ta có thể giúp đỡ ở đó nếu chúng ta biết những gì nó phải làm.


Vui lòng trích dẫn các phần có liên quan của bài viết trong trường hợp nó được gỡ bỏ. Đừng đề nghị làm một cái gì đó mà không giải thích lý do tại sao.
PhilT

0

CẬP NHẬT cho Rails 5:

db:create- Tạo cơ sở dữ liệu cho môi trường RAILS_ENV hiện tại . Nếu RAILS_ENV không được chỉ định, nó sẽ mặc định cho cơ sở dữ liệu thử nghiệm và phát triển.

db:create:all - Tạo cơ sở dữ liệu cho tất cả các môi trường.

db:drop- Bỏ cơ sở dữ liệu cho môi trường RAILS_ENV hiện tại . Nếu RAILS_ENV không được chỉ định, nó sẽ mặc định cho cơ sở dữ liệu thử nghiệm và phát triển.

db:drop:all - Bỏ cơ sở dữ liệu cho tất cả các môi trường.

db:migrate- Chạy di chuyển cho môi trường hiện tại chưa chạy. Theo mặc định, nó sẽ chạy di chuyển chỉ trong môi trường phát triển.

db:migrate:redo- Chạy db: di chuyển: xuốngdb: di chuyển: lên hoặc db: di chuyển: rollbackdb: di chuyển: lên tùy thuộc vào di chuyển được chỉ định.

db:migrate:up - Chạy lên cho PHIÊN BẢN di chuyển nhất định.

db:migrate:down - Chạy xuống cho VERSION di chuyển nhất định.

db:migrate:status - Hiển thị trạng thái di chuyển hiện tại.

db:migrate:rollback - Rolls lại di chuyển cuối cùng.

db:version - In phiên bản lược đồ hiện tại.

db:forward - Đẩy lược đồ sang phiên bản tiếp theo.

db:seed- Chạy tệp db / seed.rb.

db:schema:loadTái tạo cơ sở dữ liệu từ tệp lược đồ.rb.

db:schema:dumpBãi schema môi trường hiện tại để db / schema.rb .

db:structure:load- Tái tạo lại cơ sở dữ liệu từ structure.sql tập tin.

db:structure:dump- Kết xuất lược đồ của môi trường hiện tại thành db / architecture.sql . (Bạn có thể chỉ định một tệp khác với SCHEMA=db/my_structure.sql)

db:setupChạy db: tạo , db: lược đồ: tảidb: seed .

db:resetChạy db: dropdb: setup . db:migrate:reset- Chạy db: drop , db: tạodb: di chuyển .

db:test:prepare- Kiểm tra di chuyển đang chờ xử lý và tải lược đồ kiểm tra. (Nếu bạn chạy rake mà không có bất kỳ đối số nào, nó sẽ làm điều này theo mặc định.)

db:test:clone - Tái tạo cơ sở dữ liệu thử nghiệm từ lược đồ cơ sở dữ liệu của môi trường hiện tại.

db:test:clone_structure- Tương tự như db: test: clone , nhưng nó sẽ đảm bảo rằng cơ sở dữ liệu thử nghiệm của bạn có cùng cấu trúc, bao gồm bộ ký tự và đối chiếu, như cơ sở dữ liệu của môi trường hiện tại của bạn.

db:environment:set- Đặt môi trường RAILS_ENV hiện tại trong bảng ar_iternal_metadata . (Được sử dụng như một phần của kiểm tra môi trường được bảo vệ.)

db:check_protected_environments- Kiểm tra xem một hành động phá hoại có thể được thực hiện trong môi trường RAILS_ENV hiện tại không . Được sử dụng nội bộ khi chạy một hành động phá hoại, chẳng hạn như db: drop hoặc db: lược đồ: load .

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.