我的开发数据库中有一些数据,我想在我的测试环境中用作固定装置。Rails 2.x 中将数据库表导出到 YAML 夹具的最佳方法是什么?
11 回答
为此有一个 rake 任务。如果需要,您可以指定 RAILS_ENV;默认是开发环境:
rake db:fixtures:dump
# Create YAML test fixtures from data in an existing database.
我一直在使用 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/
该插件将添加您想要的功能。它是从 ActiveRecord 中提取的,因此默认情况下不再提供。
script/plugin install http://github.com/topfunky/ar_fixtures
然后运行:
rake db:fixtures:dump MODEL=ModelName
对于 Rails 3,如果您想从数据库中转储 yaml 并将其用作固定装置,我使用以下代码:
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 非常适合转储和保存 db,但其格式与固定装置不兼容。
Iron Fixture Extractor正是为此目的而建造的。它特别适用于您希望为不同的测试场景使用不同的夹具集(而不是为所有测试使用所有夹具)的情况。它提供了用于提取、加载、重建夹具、截断表或从夹具 yaml 文件中获取特定哈希的功能。
rake db:fixtures:dump
已更改为
rake db:extract_fixtures
这是一个 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 ://sachchua.com/blog/2011/05/rails-exporting-data-specific-tables-fixtures/
注意:我必须对博客代码进行一些更改,以使其更加跨数据库兼容并在 Rails 3.2 中工作
> rails c
irb> puts Modelname.all.to_yaml
然后将其复制并粘贴到文件中并对其进行编辑以匹配灯具的期望。
这是体力劳动,但如果您只需要一次可能是最快的方法。
对于在 Rails 3 中转储 rspec/cucumber 测试装置,这是我找到的最佳答案: 将 db 转储到 Rails 中的 yml 装置的标准方法是什么?
我在 Rails 6 中使用了这个:
# How to run:
# rake fixtures:import_db_table[my_table]
namespace :fixtures do
desc 'Convert development table into Rails test fixtures'
task :import_db_table, [:table_name] => :environment do |_task, args|
begin
table_name = args[:table_name]
raise "Missing table name" if table_name.blank?
conter = '000'
file_path = "#{Rails.root}/spec/fixtures/#{table_name}.yml"
ActiveRecord::Base.establish_connection
File.open(file_path, 'w') do |file|
rows = ActiveRecord::Base.connection.select_all("SELECT * FROM #{table_name}")
data = rows.each_with_object({}) do |record, hash|
suffix = record['id'].blank? ? conter.succ! : record['id']
hash["#{table_name.singularize}_#{suffix}"] = record
end
puts "Writing table '#{table_name}' to '#{file_path}'"
file.write(data.to_yaml)
end
ensure
ActiveRecord::Base.connection.close if ActiveRecord::Base.connection
end
end
end
从此处提取(导入所有表)。