2011-09-18 31 views
32

Tôi đang sử dụng Ruby on Rails 3.0.9 và tôi muốn tạo cơ sở dữ liệu sản xuất để thêm một số bản ghi mà không cần xây dựng lại tất cả cơ sở dữ liệu (nghĩa là, không xóa tất cả bản ghi hiện có mà chỉ thêm một số của những người chưa tồn tại). Tôi muốn làm điều đó vì dữ liệu mới là cần thiết để làm cho ứng dụng hoạt động.Làm thế nào để hạt giống cơ sở dữ liệu sản xuất bằng cách sử dụng đá quý Capistrano?

Vì vậy, kể từ khi tôi đang sử dụng viên ngọc Capistrano, tôi chạy lệnh cap -T trong giao diện điều khiển để liệt kê tất cả các lệnh có sẵn và biết làm thế nào tôi có thể thực hiện những gì tôi nhằm mục đích:

$ cap -T 
=> ... 
=> cap deploy:seed   # Reload the database with seed data. 
=> ... 

Tôi không chắc chắn trên từ "Reload" hiện diện trong phần "Nạp lại cơ sở dữ liệu với dữ liệu hạt giống". kết án. Vì vậy, câu hỏi của tôi là: nếu tôi chạy lệnh cap deploy:seed trong bảng điều khiển trên máy cục bộ của mình, quy trình tạo sẽ xóa tất cả dữ liệu hiện có trong cơ sở dữ liệu sản xuất và sau đó điền hoặc lệnh đó sẽ thêm dữ liệu mới vào cơ sở dữ liệu đó nhằm mục đích để làm gì?

Trả lời

67

Nếu bạn đang sử dụng bundler, sau đó nhiệm vụ capistrano phải là:

namespace :deploy do 
    desc "reload the database with seed data" 
    task :seed do 
    run "cd #{current_path}; bundle exec rake db:seed RAILS_ENV=#{rails_env}" 
    end 
end 

và nó có thể được đặt trong một file riêng biệt, chẳng hạn như lib/deploy/seed.rb và đưa vào tập tin deploy.rb bạn sử dụng lệnh sau:

load 'lib/deploy/seed' 
+0

Lý do tại sao nó có thể được đặt trong một tệp riêng biệt? – Backo

+2

Đôi khi bạn nên có định nghĩa chung trong một tệp riêng biệt để dễ dàng chuyển sang một dự án khác. Nếu bạn đã thêm tệp lib/deploy/seed.rb, bạn thêm phần sau vào đầu tệp deploy.rb của bạn để bao gồm nó: tải 'lib/deploy/seed' – Geekygecko

+1

Cảm ơn rất nhiều !!! chạy "cd # {current_path}; bó exec rake db: seed RAILS_ENV = # {rails_env}" làm việc lika charm: D –

6

cap deploy:seed về cơ bản có thể là tham chiếu đến rake db:seed. Nó không nên xóa dữ liệu hiện có, trừ khi bạn chỉ định nó để làm như vậy trong seed.rb của bạn.

Giả định tốt nhất cho từ "Tải lại" là :seed là lệnh không quốc tịch, tôi không tự động biết vị trí của nó, như di chuyển đường ray thông thường. Vì vậy, về mặt kỹ thuật, bạn sẽ luôn luôn "nạp lại" hạt giống, mỗi khi bạn chạy nó. ... Một dự đoán hoang dã, nhưng nó có vẻ tốt, phải không?


Hãy xem Javier Vidal câu trả lời dưới đây

+0

Vâng, đó là nên âm thanh tốt. – Backo

+2

cap deploy: seed ném "nhiệm vụ' deploy: seed 'không tồn tại " –

+1

' rails $ cap -e deploy: seed' 'Nhiệm vụ' deploy: seed 'không tồn tại.' –

7

Hãy thử thêm một cái gì đó như thế này trong deploy.rb bạn:

namespace :deploy do 
    desc "reload the database with seed data" 
    task :seed do 
    run "cd #{current_path}; rake db:seed RAILS_ENV=#{rails_env}" 
    end 
end 
5

Sau một cuộc thảo luận với các tác giả capistrano-ray đá quý tôi quyết định thực hiện điều này loại nhiệm vụ trong một viên ngọc riêng biệt. Tôi nghĩ rằng điều này giúp làm theo ý tưởng DRY và không thực hiện cùng một nhiệm vụ nhiều lần.

Tôi hy vọng nó sẽ giúp bạn: https://github.com/dei79/capistrano-rails-collection

+0

Sau trang github của dei79 tôi nhận được kết quả nhanh: 1. Gemfile: 'gem 'capistrano-rails-collection'' 2.' bundle install' 3. Capfile:' require 'capistrano/rails/collection'' 4 . 'mũ sản xuất đường ray: rake: db: seed' –

+0

Vâng, giải pháp yêu thích của tôi ở đây. Người đàn ông siêu tuyệt vời! –

6

Sử dụng Capistrano 3, Rails 4, và SeedMigrations, tôi đã tạo ra một Capistrano seed.rb nhiệm vụ dưới/lib/capistrano/nhiệm vụ:

namespace :deploy do 
    desc 'Runs rake db:seed for SeedMigrations data' 
    task :seed => [:set_rails_env] do 
    on primary fetch(:migration_role) do 
     within release_path do 
     with rails_env: fetch(:rails_env) do 
      execute :rake, "db:seed" 
     end 
     end 
    end 
    end 

    after 'deploy:migrate', 'deploy:seed' 
end 

hạt giống của tôi di chuyển bây giờ hoàn toàn tách biệt với việc di chuyển lược đồ của tôi và chạy theo quy trình di chuyển db:. Vui thế!:)

+0

Tôi nghĩ rằng nó cần phải được đặt tên là 'seed.rake' để làm cho nó tự động tải bằng cách sử dụng Capfile mặc định. – Troy

23

này đã làm việc cho tôi:

task :seed do 
puts "\n=== Seeding Database ===\n" 
on primary :db do 
    within current_path do 
    with rails_env: fetch(:stage) do 
     execute :rake, 'db:seed' 
    end 
    end 
end 
end 

capistrano 3, Rails 4

+0

Đặt mã đó vào lib/capistrano/tasks và gọi nó là XXX.rake –

+2

+1 để sử dụng tốt và sạch sẽ với «rails_env: fetch (: stage)' – lucke84

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