Ruby on rails RubyonRails2.3.5:用数据填充我的prod和devel数据库(迁移还是固定?)

Ruby on rails RubyonRails2.3.5:用数据填充我的prod和devel数据库(迁移还是固定?),ruby-on-rails,ruby,migration,fixtures,Ruby On Rails,Ruby,Migration,Fixtures,我需要用特定表中的数据填充我的生产数据库应用程序。这是在任何人接触应用程序之前。在开发模式中也需要这些数据,因为测试时需要这些数据。fixture通常是测试数据的方式,但是RubyonRails在创建db时将数据发送到实时数据库的“最佳实践”是什么 最终,我想这是一个由两部分组成的问题 1) 将测试数据加载到我的数据库进行开发的最佳方式是什么,大约有1000项。是通过迁移还是通过固定装置?这与下面的问题不同的原因是,在开发过程中,表中的某些字段是我想随机生成的。在生产中,这些字段都以相同的值0开

我需要用特定表中的数据填充我的生产数据库应用程序。这是在任何人接触应用程序之前。在开发模式中也需要这些数据,因为测试时需要这些数据。fixture通常是测试数据的方式,但是RubyonRails在创建db时将数据发送到实时数据库的“最佳实践”是什么

最终,我想这是一个由两部分组成的问题

1) 将测试数据加载到我的数据库进行开发的最佳方式是什么,大约有1000项。是通过迁移还是通过固定装置?这与下面的问题不同的原因是,在开发过程中,表中的某些字段是我想随机生成的。在生产中,这些字段都以相同的值0开头

2) 用我需要的实时数据引导生产数据库的最佳方法是什么?这也是通过迁移还是固定装置实现的


我认为答案是这里描述的播种:但我需要一种为发展播种和为生产播种的方法。另外,如果可以播种,为什么还要麻烦使用固定装置呢?一个人什么时候播种,什么时候使用夹具?

通常夹具用于向测试提供数据,而不是将数据填充到数据库中。你可以——有些人也有,比如你指向的链接——使用固定装置来达到这个目的

fixture还可以,但是使用Ruby给了我们一些优势:例如,能够读取CSV文件并基于该数据集填充记录。或者,如果您真的愿意,也可以从YAML fixture文件中读取:因为您是从编程语言开始的,所以您的选项是完全开放的

我目前的团队尝试使用db/seed.rb,并检查RAILS_ENV,以便在某些位置仅加载某些数据

关于DB:种子的恼人的事情是它是一个一次性的东西:所以如果你有更多的项目要添加在开发的中间-或者当你的应用程序已经击中生产…嗯,您需要考虑到这一点(ActiveRecord的find_或create_by…()方法可能是您的朋友)

我们尝试了这个插件,它将一个很好的DSL置于RAILS_ENV检查之上,让您只运行您想要的环境。非常好

我们的需求实际上超出了这一范围——我们发现我们需要为种子数据进行数据库式的迁移。现在,我们将普通的Ruby脚本放入一个文件夹(db/bootstrapdata/)中,并使用Arild Shirazi的gem运行这些脚本,以加载(并运行)该目录中的脚本

现在,这只提供了部分数据库样式的迁移。从这一点到创建一个数据迁移只能运行一次(如数据库迁移)的环境并不难


您的需求可能会停留在bootstrapper上:我们有非常独特的需求(在我们只知道一半规范的情况下开发系统,庞大的Rails团队,上一代软件的大数据迁移。您的需求可能会更简单)。

如果您确实想使用夹具,与seed相比的优势是您还可以轻松导出

对rake任务的外观的快速猜测如下

  desc 'Export the data objects to Fixtures from data in an existing 
  database.  Defaults to development database.  Set RAILS_ENV to override.'
  task :export => :environment do
    sql  = "SELECT * FROM %s"
    skip_tables = ["schema_info"]
    export_tables = [
      "roles", 
      "roles_users", 
      "roles_utilities",
      "user_filters", 
      "users",
      "utilities"
    ]

    time_now = Time.now.strftime("%Y_%h_%d_%H%M")
    folder = "#{RAILS_ROOT}/db/fixtures/#{time_now}/"
    FileUtils.mkdir_p folder
    puts "Exporting data to #{folder}"

    ActiveRecord::Base.establish_connection(:development)
    export_tables.each do |table_name|
      i = "000"
      File.open("#{folder}/#{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

  desc "Import the models that have YAML files in 
  db/fixture/defaults or from a specified path."
  task :import do
    location = 'db/fixtures/default' 
    puts ""
    puts "enter import path [#{location}]"
    location_in = STDIN.gets.chomp
    location = location_in unless location_in.blank?
    ENV['FIXTURES_PATH'] = location
    puts "Importing data from #{ENV['FIXTURES_PATH']}"
    Rake::Task["db:fixtures:load"].invoke
  end