Ruby on rails 在rails中将db转储到yml设备的标准方法是什么?

Ruby on rails 在rails中将db转储到yml设备的标准方法是什么?,ruby-on-rails,rake,Ruby On Rails,Rake,我见过一些插件和自定义rake任务将活动db转储到fixture,但我不确定流行的技术是什么 基本上,我想要的是rake:db:fixtures:load的反面,这样我就可以在部署时将基本的db信息(比如管理员用户帐户)放入svn中。我不想为样本数据等需要很长时间的事情手动创建装置 当我们部署时,我希望能够运行 rake db:migrate rake db:fixtures:load 然后去参加比赛 在rails中执行此操作的最佳/首选方法是什么 编辑: 因此,似乎没有标准的方法来执行db:

我见过一些插件和自定义rake任务将活动db转储到fixture,但我不确定流行的技术是什么

基本上,我想要的是rake:db:fixtures:load的反面,这样我就可以在部署时将基本的db信息(比如管理员用户帐户)放入svn中。我不想为样本数据等需要很长时间的事情手动创建装置

当我们部署时,我希望能够运行

rake db:migrate
rake db:fixtures:load
然后去参加比赛

在rails中执行此操作的最佳/首选方法是什么

编辑:

因此,似乎没有标准的方法来执行db:fixtures:load的相反rake任务

我不想使用迁移,因为我想为我所有的项目使用一种标准的迁移方法,而且我不喜欢在迁移中使用比管理员帐户更多的方法。其次,我一直在重新考虑使用固定装置的想法。我决定使用yaml_db,因为它使用rake任务:

rake db:data:dump
rake db:data:load
数据将在YAML文件中结束,而不会中断测试装置(这可能会有所不同,现在我更仔细地考虑这一点)。另外,如果像Heroku这样的主要发行工具正在使用它,我就不必担心支持/寿命问题

我想这是最接近我将找到的“标准”


感谢所有的精彩回复。

它使用的格式与db:fixtures:load所期望的格式并不完全相同,但它使转储和加载数据作为YAML文件变得非常简单。

Heroku使用了YamlDB Gem


我认为如果这是标准的管理信息,那么最好在迁移中使用它。理想情况下,夹具应仅用于测试

没有标准的方法来做这件事。仅以标准方式加载设备:

rake db:fixtures:load
但互联网上有很多例子:

  • :)

听起来您应该使用db/seeds.rb和相关的rake db:seed任务。这些是专门为加载种子数据而设计的。然后你可以打电话给 加载数据并rake db:data:dump_dir将所有装置转储到临时目录,并根据需要将其复制到种子数据目录

请注意,这不适用于倾倒装置,因为YAML格式不同。上面提到的ar_固定装置不适用于Rails 3,并且似乎不再受支持。对于转储fixtures,您可能希望在lib/tasks/dump_fixtures.rake中尝试类似的操作:

namespace :db do
  namespace :fixtures do    
    desc 'Create YAML test fixtures from data in an existing database.  
    Defaults to development database.  Specify RAILS_ENV=production on command line to override.'
    task :dump => :environment do
      sql  = "SELECT * FROM %s"
      skip_tables = ["schema_migrations"]
      ActiveRecord::Base.establish_connection(Rails.env)
      (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name|
        i = "000"
        File.open("#{Rails.root}/test/fixtures/#{table_name}.yml.new", '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

我找到了这个,并对Rails3做了一些修改。

对于其他刚刚找到这个的人,我稍微修改了@jpgeek的答案。将
schema\u migration
表包括在忽略列表中,并按ID排序,这样我得到的输出是
table\u name\u 001
for
ID=1

namespace :db do
  namespace :fixtures do    
    desc 'Create YAML test fixtures from data in an existing database.  
    Defaults to development database.  Specify RAILS_ENV=production on command line to override.'
    task :dump => :environment do
      sql  = "SELECT * FROM %s ORDER BY ID"
      skip_tables = ["schema_info", "schema_migrations"]
      ActiveRecord::Base.establish_connection(Rails.env)
      (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name|
        i = "000"
        File.open("#{Rails.root}/test/fixtures/#{table_name}.yml.new", '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

如果有比管理员帐户更多的数据,我不喜欢使用迁移的想法。我希望我的所有rails项目都有一个标准的过程。不过,你只使用夹具进行测试是对的。我越是考虑这个问题,就越意识到数据应该与fixture或migrations放在一个单独的文件中。如果你使用Heroku,那么你可以使用taps:YamlDB非常适合转储数据库并重新加载它们。但是,YAML格式与fixture不兼容。抱歉,这完全是胡说八道。。为什么YAML foramt不应该与固定装置兼容?对不起,让我说得更准确些。YamlDB创建的YAML格式与用于固定装置的YAML格式不同。YamlDB以:开始,然后包含列:然后记录:它包含列中列出的每个字段的行:对于每个记录。fixture的格式只是记录键(例如users1),后跟字段的键/值对,例如id:1、用户名:bob等。没有列名称或其他元数据。@jpgeek是正确的。不知道为什么这个问题会被否决;YamlDB是相关的,在这种情况下do是无用的。详细说明Rake任务代码的答案是正确的。ar_fixture不适用于Rails 3,并且似乎不再受支持。此外,在Rails的新版本中,您必须将Rails_ENV更改为Rails.ENV.Why.yml.new(与.yml相反),非常感谢。一个多小时以来,我一直在寻找一个直接的解决方案。对于试图为Cumber测试加载fixture的任何人,请将上述内容与以下内容结合起来:,但一定要更改其中一个,以便它们引用相同的fixture文件夹…应该跳过表
schema\u migrations
not
schema\u info
@Hari:Rails 3在编写和回答此问题时甚至不存在;大概这两个版本都不是特定的。