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
rake db:fixtures:dump
has been changed to
rake db:extract_fixtures
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/
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
> 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.
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.
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?