Mattew
Mattew

Reputation: 537

Best way to export a database table to a YAML file?

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

Answers (11)

HectorPerez
HectorPerez

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

vanboom
vanboom

Reputation: 1332

Very simple gem will create yaml fixtures from existing database...

github.com/vanboom/yaml_dump

Works with Rails 4.

Upvotes: 2

Tom Maeckelberghe
Tom Maeckelberghe

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

Joe Goggins
Joe Goggins

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

Hari Honor
Hari Honor

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

Pierre
Pierre

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

jpgeek
jpgeek

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

Brian Armstrong
Brian Armstrong

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

Zoli
Zoli

Reputation: 45

rake db:fixtures:dump

has been changed to

rake db:extract_fixtures

Upvotes: 2

Andrew Vit
Andrew Vit

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

Geekygecko
Geekygecko

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

Related Questions