2011-10-07 25 views
65

Bạn sẽ phải thừa nhận, với một người mới đến đường ray và cơ sở dữ liệu, lời giải thích chính thức trên rubyonrails.org làm cho tất cả bốn nhiệm vụ này giống hệt nhau. Trích dẫn:Sự khác nhau giữa db: test: clone, db: test: clone_structure, db: test: load, và db: test: preparation?

rake db:test:clone Recreate the test database from 
        the current environment’s database schema 

rake db:test:clone_structure Recreate the test database from the 
           development structure 

rake db:test:load Recreate the test database from the current schema.rb 

rake db:test:prepare Check for pending migrations and load the test schema 

Tôi thậm chí không biết sự khác biệt giữa cấu trúc và lược đồ. Và sự khác biệt giữa việc tải lược đồ của môi trường hiện tại và chỉ cần tải schema.rb là gì?

Các tác vụ này tương tự như thế nào (hoặc khác)?

Trả lời

61

Câu hỏi rất hay. Đã cho tôi stumped vì vậy tôi chim bồ câu vào nguồn rails và kéo lên database.rake. Bây giờ thì rõ ràng hơn:

db:test:clone chỉ là một sự kết hợp của db:schema:dumpdb:test:load:

task :clone => %w(db:schema:dump db:test:load) 

db:test:clone_structure sử dụng {} RAILS_ENV tập tin _structure.sql:

task :clone_structure => [ 'db:structure:dump', 'db:test:purge' ] do 
    # skipped some code, here's what happens for MySQL: 
    ActiveRecord::Base.establish_connection(:test) 
    # ... 
    IO.readlines("#{Rails.root}/db/#{Rails.env}_structure.sql").join.split("\n\n").each do |table| 
    ActiveRecord::Base.connection.execute(table) 
    end 
end 

db:test:load cũng giống như db:schema:load , nhưng gọi nó trên cơ sở dữ liệu thử nghiệm:

task :load => 'db:test:purge' do 
    ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test']) 
    # ... 
    db_namespace['schema:load'].invoke 
end 

db:test:prepare thông báo cho bạn nếu mọi di chuyển đang chờ xử lý và nếu không, hãy chạy db:test:clone_structure (sử dụng tệp {rails_env} _structure.sql) hoặc db:test:load (sử dụng tệp schema.rb), tùy thuộc vào định dạng lược đồ (đây là ít gây nhầm lẫn cho tôi, có thể ai đó khác có thể mở rộng trên đó):

task :prepare => 'db:abort_if_pending_migrations' do 
    # ... 
    db_namespace[{ :sql => 'test:clone_structure', :ruby => 'test:load' }[ActiveRecord::Base.schema_format]].invoke 
end 

Hy vọng điều này sẽ xóa! Một lần nữa, việc duyệt qua tệp database.rake thật dễ dàng và sẽ xóa mọi câu hỏi khác mà bạn có thể gặp phải. Liên kết đó đi đến dòng đó là khởi đầu của không gian tên: test.

+0

Tóm lại: Tất cả chúng đều khá giống nhau. :-p – bricker

+0

cảnh báo - Tôi thấy rằng db: test: clone đã không sao chép chính xác tính vô hiệu của các cột từ cơ sở dữ liệu phát triển của tôi. Đây có thể là một lỗi cũ mà sau đó đã được sửa chữa, như tôi đã tìm thấy nó bằng cách sử dụng Rails 2.3.12. –

20

Chúng thực sự không hoàn toàn giống nhau. Bất kỳ tác vụ nào có chứa từ 'lược đồ' hành động trên tệp .../db/schema.rb. schema.rb là hiệu quả trạng thái lược đồ của bạn sau khi áp dụng tất cả các di chuyển. Nó có thể được thực hiện để khôi phục lược đồ của bạn thay vì chạy tất cả các di chuyển db (có thể mất một thời gian dài nếu bạn có nhiều di chuyển).

Bất kỳ tác vụ nào có từ 'cấu trúc', hoạt động trên tệp {Rails.env} _structure.sql. Tệp này được sử dụng khi lược đồ của bạn chứa các cấu trúc không thể được thể hiện trong tệp schema.rb. Ví dụ, nếu bạn sử dụng các tính năng cụ thể cho một RDBMS cụ thể. Bên dưới trang bìa, đường ray tạo ra tệp này bằng cách sử dụng bất kỳ tiện ích lược đồ nào phù hợp cho RDBMS của bạn. Để khôi phục lược đồ, nó đọc tệp và thực thi các câu lệnh SQL một lần nữa bằng cách sử dụng một công cụ cụ thể của RDBMS.

Rails biết có nên đi con đường schema.rb hoặc các tuyến đường structure.sql dựa trên hay không, bạn đã thiết

config.active_record.schema_format =: sql

tại của bạn ... /config/application.rb

+1

Mở rộng tuyệt vời trên câu trả lời của người thợ gạch ở trên - cảm ơn! –

+0

ví dụ về những thứ có thể khác nhau: trình kích hoạt, chức năng và quy trình lưu trữ. (đó là lý do tại sao chúng tôi vẫn bị mắc kẹt khi sử dụng cấu trúc). –

Các vấn đề liên quan