Reputation: 537
I have some data in my development database that I would like to utilize as fixtures in my test environment. What is the best way in Rails 2.x to export a database table to a YAML fixture?
Upvotes: 32
Views: 31325
Reputation: 774
I used this in 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
Extracted from here (which imports all tables).
Upvotes: 1
Reputation: 1332
Very simple gem will create yaml fixtures from existing database...
Works with Rails 4.
Upvotes: 2
Reputation: 1999
> rails c
irb> puts Modelname.all.to_yaml
then copy & paste it in file and edit it to match what fixtures expect.
It's manual labor but if you need this just once probably the fastest way.
Upvotes: 3
Reputation: 1338
Iron Fixture Extractor was built for exactly this purpose. It's particularly good for situations where you want to use different fixture sets for different testing scenarios (rather than having all fixtures for all tests). It provides functionality for extracting, loading, rebuilding fixtures, truncating tables, or snagging particular hashes from your fixture yaml files.
Upvotes: 4
Reputation: 8914
For dumping for rspec/cucumber test fixtures in Rails 3 this is the best answer I've found: What is the standard way to dump db to yml fixtures in rails?
Upvotes: 0
Reputation: 1227
Here's a rake task that will do exactly that (tested in 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
Source: http://sachachua.com/blog/2011/05/rails-exporting-data-specific-tables-fixtures/
Note: I had to make a few changes to the blog code to make it more cross-database compatible and work in Rails 3.2
Upvotes: 1
Reputation: 5291
For Rails 3, if you want to dump yaml from the DB and use it as a fixture, I use this code:
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
I just run it from the console with
require './lib/db_to_fixture'
include DbToFixture
fixturize ModelName
I have not been able to get ar_fixtures to work with Rails 3 (haven't tried very hard though). Yaml db is great for dumping and saving the db, but its format is not compatible with fixtures.
Upvotes: 6
Reputation: 19863
This plugin will add the functionality you want. It was extracted from ActiveRecord so no longer comes by default.
script/plugin install http://github.com/topfunky/ar_fixtures
Then run:
rake db:fixtures:dump MODEL=ModelName
Upvotes: 9
Reputation: 19249
There is a rake task for this. You can specify RAILS_ENV if needed; the default is the development environment:
rake db:fixtures:dump
# Create YAML test fixtures from data in an existing database.
Upvotes: 24
Reputation: 3972
I have been using YamlDb to save the state of my database.
Install it with the following command:
script/plugin install git://github.com/adamwiggins/yaml_db.git
Use the rake task to dump the contents of Rails database to db/data.yml
rake db:data:dump
Use the rake task to load the contents of db/data.yml into the database
rake db:data:load
This is the creators homepage:
http://blog.heroku.com/archives/2007/11/23/yamldb_for_databaseindependent_data_dumps/
Upvotes: 21