Tôi có một số dữ liệu trong cơ sở dữ liệu phát triển của mình mà tôi muốn sử dụng làm đồ đạc trong môi trường thử nghiệm của mình. Cách tốt nhất trong Rails 2.x để xuất một bảng cơ sở dữ liệu vào một vật cố YAML là gì?Cách tốt nhất để xuất bảng cơ sở dữ liệu sang tệp YAML là gì?
Trả lời
Có một nhiệm vụ cào cho việc này. Bạn có thể chỉ định RAILS_ENV nếu cần; mặc định là môi trường phát triển:
rake db:fixtures:dump
# Create YAML test fixtures from data in an existing database.
Tôi đã sử dụng YamlDb để lưu trạng thái cơ sở dữ liệu của mình.
Install nó với lệnh sau:
script/plugin install git://github.com/adamwiggins/yaml_db.git
Sử dụng các nhiệm vụ cào để đổ nội dung của cơ sở dữ liệu Rails để db/data.yml
rake db:data:dump
Sử dụng nhiệm vụ cào để tải nội dung của db/data.yml vào cơ sở dữ liệu
rake db:data:load
Đây là trang chủ của người sáng tạo:
http://blog.heroku.com/archives/2007/11/23/yamldb_for_databaseindependent_data_dumps/
Các kho hiện đang duy trì hiện tại là http://github.com/ludicast/yaml_db – Sney
Làm cách nào để có thể nhắm mục tiêu một bảng để đổ, thay vì bán toàn bộ db? –
rake db:fixtures:dump
đã được thay đổi để
rake db:extract_fixtures
+ hoàn hảo, Cảm ơn vì điều này. – Jirapong
Phiên bản đường ray nào? điều này dường như không đúng với 2.x, mà câu hỏi được đặt ra. có lẽ câu trả lời của bạn là cụ thể cho đường ray 3.x? – tehgeekmeister
Nó không có trong vanilla Rails 3.x. – Turadg
Plugin này sẽ bổ sung thêm các chức năng mà bạn muốn. Nó được trích xuất từ ActiveRecord do đó không còn theo mặc định nữa.
script/plugin install http://github.com/topfunky/ar_fixtures
Sau đó chạy:
rake db:fixtures:dump MODEL=ModelName
Đối với Rails 3, nếu bạn muốn để đổ yaml từ DB và sử dụng nó như một vật cố, tôi sử dụng mã này:
module DbToFixture
TEMP_FIXTURE_PATH = Rails.root.join("test", "new_fixtures")
def fixturize(model)
Dir.mkdir(TEMP_FIXTURE_PATH) unless File.exists?(TEMP_FIXTURE_PATH)
fname = model.table_name
file_path = TEMP_FIXTURE_PATH.join(fname)
File.open(file_path, 'w') do |f|
model.all.each do |m|
f.write(m.to_yaml)
end
end
end
end
Tôi chỉ chạy nó từ bảng điều khiển với
require './lib/db_to_fixture'
include DbToFixture
fixturize ModelName
Tôi đã không thể có được ar_fixtures để làm việc với Rails 3 (đã không cố gắng rất khó khăn mặc dù). Yaml db là tuyệt vời cho việc đổ và lưu db, nhưng định dạng của nó không tương thích với các đồ đạc.
Tôi có phải đặt tên tệp là db_to_fixture không? Rails tuyệt vời không có lệnh đơn giản để thực hiện trong các đường ray mới nhất. Đây là điều tôi cần phải làm thường xuyên. –
Thật tuyệt vời. Trong mọi trường hợp, có, nó phải là trường hợp con rắn của bất kỳ module nào được gọi. – jpgeek
Dưới đây là một nhiệm vụ cào mà sẽ làm chính xác điều đó (thử nghiệm trong Rails 3.2.8):
namespace :db do
task :extract_fixtures => :environment do
sql = 'SELECT * FROM "%s"'
skip_tables = ["schema_migrations"]
ActiveRecord::Base.establish_connection
if (not ENV['TABLES'])
tables = ActiveRecord::Base.connection.tables - skip_tables
else
tables = ENV['TABLES'].split(/, */)
end
if (not ENV['OUTPUT_DIR'])
output_dir="#{Rails.root}/test/fixtures"
else
output_dir = ENV['OUTPUT_DIR'].sub(/\/$/, '')
end
(tables).each do |table_name|
i = "000"
File.open("#{output_dir}/#{table_name}.yml", 'w') do |file|
data = ActiveRecord::Base.connection.select_all(sql % table_name.upcase)
file.write data.inject({}) { |hash, record|
hash["#{table_name}_#{i.succ!}"] = record
hash
}.to_yaml
puts "wrote #{table_name} to #{output_dir}/"
end
end
end
end
Nguồn: http://sachachua.com/blog/2011/05/rails-exporting-data-specific-tables-fixtures/
Lưu ý: Tôi đã phải thực hiện một vài thay đổi mã blog để làm cho nó tương thích với nhiều cơ sở dữ liệu hơn và làm việc trong Rails 3.2
Kịch bản hay. Tôi đã phải loại bỏ '.upcase' để làm cho nó hoạt động trong Rails 4 nhưng nếu không, nó hoạt động như quảng cáo. Cảm ơn. –
Đối với bán phá giá đối với rspec/đồ đạc kiểm tra dưa chuột trong Rails 3 này là câu trả lời tốt nhất mà tôi đã tìm thấy: What is the standard way to dump db to yml fixtures in rails?
Iron Fixture Extractor được xây dựng cho mục đích này chính xác. Nó đặc biệt tốt cho các tình huống mà bạn muốn sử dụng các bộ cố định khác nhau cho các kịch bản thử nghiệm khác nhau (thay vì có tất cả các đồ đạc cho tất cả các thử nghiệm). Nó cung cấp chức năng để giải nén, tải, xây dựng lại đồ đạc, cắt bớt bảng, hoặc snagging băm đặc biệt từ tập tin yaml lịch thi đấu của bạn.
Cảm ơn bạn đã giới thiệu tuyệt vời này. Tôi thấy nó đặc biệt hữu ích vì nó cho phép tôi trích xuất một phần dữ liệu cho mục đích thử nghiệm trên một bảng khá lớn. – smile2day
> rails c
irb> puts Modelname.all.to_yaml
dán vào tệp và chỉnh sửa để phù hợp với nội dung mong đợi.
Đó là lao động thủ công nhưng nếu bạn cần điều này chỉ một lần có thể là cách nhanh nhất.
Dường như không hoạt động trên Rails 4. –
ngọc Rất đơn giản sẽ tạo ra đồ đạc yaml từ cơ sở dữ liệu hiện có ...
trình với Rails 4.
db: đồ đạc: đổ trên Rails? Tôi không thấy nó trên 2.3.5. – Pablo
có vẻ như nó đã được trích xuất từ ActiveRecord. Bạn có thể thêm lại nó bằng plugin này: http://github.com/topfunky/ar_fixtures Sau đó chạy: rake db: fixtures: dump MODEL = ModelName –
tính năng này chỉ hợp lệ cho Rails 3. – fotanus