将数据库表导出到YAML文件的最佳方法?

时间:2009-01-29 04:52:05

标签: ruby-on-rails yaml

我的开发数据库中有一些数据,我想在我的测试环境中用作固定装置。 Rails 2.x中将数据库表导出到YAML夹具的最佳方法是什么?

11 个答案:

答案 0 :(得分:24)

这有一个rake任务。如果需要,您可以指定RAILS_ENV;默认是开发环境:

rake db:fixtures:dump
    # Create YAML test fixtures from data in an existing database.

答案 1 :(得分:21)

我一直在使用YamlDb保存数据库的状态。

使用以下命令安装它:

script/plugin install git://github.com/adamwiggins/yaml_db.git 

使用rake任务将Rails数据库的内容转储到db / data.yml

rake db:data:dump

使用rake任务将db / data.yml的内容加载到数据库中

rake db:data:load

这是创作者主页:

http://blog.heroku.com/archives/2007/11/23/yamldb_for_databaseindependent_data_dumps/

答案 2 :(得分:9)

此插件将添加您想要的功能。它是从ActiveRecord中提取的,因此默认情况下不再出现。

script/plugin install http://github.com/topfunky/ar_fixtures

然后运行:

rake db:fixtures:dump MODEL=ModelName

答案 3 :(得分:6)

对于Rails 3,如果你想从数据库中转储yaml并将其用作一个fixture,我使用这段代码:

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

我只是通过

从控制台运行它
require './lib/db_to_fixture'
include DbToFixture
fixturize ModelName

我无法让ar_fixtures与Rails 3一起使用(虽然没有尝试过很努力)。 Yaml db非常适合转储和保存数据库,但其格式与fixtures不兼容。

答案 4 :(得分:4)

Iron Fixture Extractor就是为了这个目的而建立的。对于您希望针对不同测试场景使用不同夹具组的情况(而不是为所有测试使用所有夹具),它尤其适用。它提供了从夹具yaml文件中提取,加载,重建夹具,截断表或阻止特定哈希的功能。

答案 5 :(得分:2)

rake db:fixtures:dump

已更改为

rake db:extract_fixtures

答案 6 :(得分:2)

非常简单的gem将从现有数据库中创建yaml灯具......

github.com/vanboom/yaml_dump

适用于Rails 4。

答案 7 :(得分:1)

这是一个rake任务,它将完全执行(在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

来源:http://sachachua.com/blog/2011/05/rails-exporting-data-specific-tables-fixtures/

注意:我必须对博客代码进行一些更改,以使其更符合跨数据库并在Rails 3.2中工作

答案 8 :(得分:1)

 > rails c
 irb> puts Modelname.all.to_yaml

然后复制&将其粘贴到文件中并进行编辑以匹配期望的灯具。

它是手工劳动,但如果您只需要一次,那么可能是最快的方法。

答案 9 :(得分:0)

对于在Rails 3中转储rspec / cucumber测试夹具,这是我发现的最佳答案: What is the standard way to dump db to yml fixtures in rails?

答案 10 :(得分:0)

我在Rails 6中使用了它:

node

here(提取所有表)中提取。