DZone 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

Snippets has posted 5883 posts at DZone. View Full User Profile

Synchronizing Rails DB Contents Via Fixtures

  • submit to reddit
        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.connection.tables - skip_tables).each do |table_name|
        i = "000""#{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

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


Snippets Manager replied on Mon, 2007/12/10 - 2:41am

oops tables=ENV['TABLES'].split(',') tables ||= (ActiveRecord::Base.connection.tables - skip_tables) tables.each do |table_name|

Snippets Manager replied on Mon, 2007/12/10 - 2:41am

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|

Michael Christe... replied on Thu, 2007/11/29 - 11:45pm

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!