Ruby on Rails 2.3.5: заполнение моей базы данных prod и devel данными (миграция или фикстура?) - PullRequest
3 голосов
/ 06 мая 2010

Мне нужно заполнить мое приложение производственной базы данных данными в определенных таблицах. Это прежде, чем кто-либо когда-либо даже коснется приложения. Эти данные также потребуются в режиме разработки, поскольку они необходимы для тестирования. Фиксаторы обычно являются способом проверки данных, но какова "лучшая практика" для Ruby on Rails по отправке этих данных в оперативную базу данных также при создании базы данных?

В конечном счете, это вопрос из двух частей.

1) Как лучше всего загрузить тестовые данные в мою базу данных для разработки, это будет примерно 1000 элементов. Это через миграцию или через приспособления? Причина, по которой этот ответ отличается от ответа на приведенный ниже вопрос, заключается в том, что в процессе разработки в таблицах есть определенные поля, которые я хотел бы сделать случайными. В производстве все эти поля начинаются с одинакового значения 0.

2) Как лучше всего запустить производственную базу данных с нужными мне живыми данными, это тоже через миграцию или фикстуру?

Я думаю, что ответом является семя, как описано здесь: http://lptf.blogspot.com/2009/09/seed-data-in-rails-234.html, но мне нужен способ для семян для развития и семян для производства. Кроме того, зачем использовать приспособления, если есть возможность посева? Когда одно семя и когда одно использует приспособления?

Ответы [ 2 ]

3 голосов
/ 06 мая 2010

Обычно приборы используются для обеспечения ваших тестов данными, а не для заполнения данных в вашей базе данных. Вы можете - и некоторые люди, как и ссылки, на которые вы указываете, - использовать приборы для этой цели.

С приборами все в порядке, но использование Ruby дает нам некоторые преимущества: например, возможность читать из файла CSV и заполнять записи на основе этого набора данных. Или читайте из файла фиксации YAML, если вы действительно этого хотите: начиная с того, что вы начинаете с языка программирования, ваши возможности уже открыты.

Моя текущая команда пыталась использовать db / seed.rb и проверяла RAILS_ENV для загрузки только определенных данных в определенных местах.

Раздражающая вещь в db: seed заключается в том, что она должна быть единственной в своем роде: так что если у вас есть дополнительные элементы, которые нужно добавить в процессе разработки - или когда ваше приложение вступает в производство - ... ну, вам нужно принять это во внимание (метод find_or_create_by ... () ActiveRecord может быть вашим другом здесь).

Мы попробовали плагин Bootstrapper , который ставит хороший DSL поверх проверки RAILS_ENV и позволяет запускать только ту среду, которую вы хотите. Это довольно мило.

Наши потребности на самом деле пошли дальше - мы обнаружили, что нам нужны миграции в стиле базы данных для наших начальных данных. Прямо сейчас мы помещаем обычные сценарии Ruby в папку (db / bootstrapdata /) и запускаем эти сценарии с помощью Арилда Ширази, необходимого gem для загрузки (и, следовательно, запуска) сценариев в этом каталоге.

Теперь это только часть миграции в стиле базы данных. Нетрудно перейти от этого к созданию чего-либо, где эти миграции данных могут быть выполнены только один раз (например, миграции баз данных).

Ваши потребности могут остановиться на начальном загрузчике: у нас есть довольно уникальные потребности (разработка системы, когда мы знаем только половину спецификации, обширная команда Rails, миграция больших данных из программного обеспечения предыдущего поколения. Ваши потребности могут быть проще).

0 голосов
/ 06 мая 2010

Если вы хотите использовать светильники, преимущество перед семенем состоит в том, что вы также можете легко экспортировать.

Быстрое предположение о том, как может выглядеть задача рейка, выглядит следующим образом

  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
...