Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Synchronizing Rails DB Contents via Fixtures (See related posts)

The following rake task will dump the contents of the current environment's database to YAML fixtures. Stick the following in lib/tasks/fixtures.rake:

namespace :db do
  namespace :fixtures do
    
    desc 'Create YAML test fixtures from data in an existing database.  
    Defaults to development database.  Set RAILS_ENV to override.'
    task :dump => :environment do
      sql  = "SELECT * FROM %s"
      skip_tables = ["schema_info"]
      ActiveRecord::Base.establish_connection(:development)
      (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name|
        i = "000"
        File.open("#{RAILS_ROOT}/test/fixtures/#{table_name}.yml", 'w') do |file|
          data = ActiveRecord::Base.connection.select_all(sql % table_name)
          file.write data.inject({}) { |hash, record|
            hash["#{table_name}_#{i.succ!}"] = record
            hash
          }.to_yaml
        end
      end
    end
  end
end


After making changes to the database that you'd like to dump to fixtures:

rake db:fixtures:dump


After checking out updated fixtures from SVN:

rake db:migrate
rake db:fixtures:load

Comments on this post

m3talsmith posts on Nov 29, 2007 at 23:49
A slight modification:
...
      ActiveRecord::Base.establish_connection(RAILS_ENV)
...

I did that so that I could easily transfer data from production to yaml for a mysql to sqlite data conversion.

Thanks for the code. Cheers!
chrisff posts on Dec 10, 2007 at 02:43
If you want to pass specific tables, e.g.
rake db:fixtures:dump TABLES=users


tweak with this...
      tables=ENV['TABLES']
      tables ||= (ActiveRecord::Base.connection.tables - skip_tables)
      tables.each do |table_name|

chrisff posts on Dec 10, 2007 at 03:12
oops
      tables=ENV['TABLES'].split(',')
      tables ||= (ActiveRecord::Base.connection.tables - skip_tables)
      tables.each do |table_name|

You need to create an account or log in to post comments to this site.


Click here to browse all 4856 code snippets

Related Posts