我的开发数据库中有一些数据,我想在我的测试环境中用作固定装置。 Rails 2.x中将数据库表导出到YAML夹具的最佳方法是什么?
答案 0 :(得分:24)
这有一个rake任务。如果需要,您可以指定RAILS_ENV;默认是开发环境:
rake db:fixtures:dump
# Create YAML test fixtures from data in an existing database.
答案 1 :(得分:21)
我一直在使用YamlDb保存数据库的状态。
使用以下命令安装它:
script/plugin install git://github.com/adamwiggins/yaml_db.git
使用rake任务将Rails数据库的内容转储到db / data.yml
rake db:data:dump
使用rake任务将db / data.yml的内容加载到数据库中
rake db:data:load
这是创作者主页:
http://blog.heroku.com/archives/2007/11/23/yamldb_for_databaseindependent_data_dumps/
答案 2 :(得分:9)
此插件将添加您想要的功能。它是从ActiveRecord中提取的,因此默认情况下不再出现。
script/plugin install http://github.com/topfunky/ar_fixtures
然后运行:
rake db:fixtures:dump MODEL=ModelName
答案 3 :(得分:6)
对于Rails 3,如果你想从数据库中转储yaml并将其用作一个fixture,我使用这段代码:
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
我只是通过
从控制台运行它require './lib/db_to_fixture'
include DbToFixture
fixturize ModelName
我无法让ar_fixtures与Rails 3一起使用(虽然没有尝试过很努力)。 Yaml db非常适合转储和保存数据库,但其格式与fixtures不兼容。
答案 4 :(得分:4)
Iron Fixture Extractor就是为了这个目的而建立的。对于您希望针对不同测试场景使用不同夹具组的情况(而不是为所有测试使用所有夹具),它尤其适用。它提供了从夹具yaml文件中提取,加载,重建夹具,截断表或阻止特定哈希的功能。
答案 5 :(得分:2)
rake db:fixtures:dump
已更改为
rake db:extract_fixtures
答案 6 :(得分:2)
答案 7 :(得分:1)
这是一个rake任务,它将完全执行(在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
来源:http://sachachua.com/blog/2011/05/rails-exporting-data-specific-tables-fixtures/
注意:我必须对博客代码进行一些更改,以使其更符合跨数据库并在Rails 3.2中工作
答案 8 :(得分:1)
> rails c
irb> puts Modelname.all.to_yaml
然后复制&将其粘贴到文件中并进行编辑以匹配期望的灯具。
它是手工劳动,但如果您只需要一次,那么可能是最快的方法。
答案 9 :(得分:0)
对于在Rails 3中转储rspec / cucumber测试夹具,这是我发现的最佳答案: What is the standard way to dump db to yml fixtures in rails?
答案 10 :(得分:0)