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

后端 未结 11 1206
野的像风
野的像风 2020-12-07 14:54

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

相关标签:
11条回答
  • 2020-12-07 15:22

    rake db:fixtures:dump

    has been changed to

    rake db:extract_fixtures

    0 讨论(0)
  • 2020-12-07 15:24

    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/

    0 讨论(0)
  • 2020-12-07 15:26

    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

    0 讨论(0)
  • 2020-12-07 15:27
     > 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.

    0 讨论(0)
  • 2020-12-07 15:29

    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.

    0 讨论(0)
  • 2020-12-07 15:37

    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?

    0 讨论(0)
提交回复
热议问题