Данные о посеве с опасностями в Ruby on Rails
У меня есть записи с исходными данными, которые должны находиться в моей базе данных (страны, регионы, перевозчики и т.д.). У меня есть задача rake db: seed, которая будет засеять базу данных.
namespace :db do
desc "Load seed fixtures (from db/fixtures) into the current environment database."
task :seed => :environment do
require 'active_record/fixtures'
Dir.glob(RAILS_ROOT + '/db/fixtures/yamls/*.yml').each do |file|
Fixtures.create_fixtures('db/fixtures/yamls', File.basename(file, '.*'))
end
end
end
Я немного волнуюсь, потому что эта задача очищает мою базу данных и загружает исходные данные. Тот факт, что это даже возможно сделать не один раз на производстве, пугает меня дерьмом. Это нормально, и я просто должен быть осторожным? Или люди обычно так или иначе защищают такую задачу?
Ответы
Ответ 1
Посещение данных с помощью светильников - очень плохая идея.
Светильники не проверяются, и поскольку большинство разработчиков Rails не используют ограничения базы данных, это означает, что вы можете легко получить недопустимые или неполные данные, вставленные в вашу производственную базу данных.
Приборы также устанавливают странные идентификаторы первичного ключа по умолчанию, что не обязательно является проблемой, но раздражает работу.
Есть много решений для этого. Мой личный фаворит - это задача rake, которая запускает Ruby script, который просто использует ActiveRecord для вставки записей. Это то, что Rails 3 будет делать с db:seed
, но вы можете легко написать это самостоятельно.
Я дополняю это с помощью метода, который я добавляю к ActiveRecord:: Base под названием create_or_update
. Используя это, я могу несколько раз запускать семя script, обновляя старые записи, а не бросая исключение.
Я написал статью об этих методах, а затем вызвал Загрузка данных семян.
Ответ 2
В первой части вашего вопроса, да, я бы поставил некоторые меры предосторожности для выполнения такой задачи в процессе производства. Я поставил такую защиту в моей задаче начальной загрузки/загрузки:
task :exit_or_continue_in_production? do
if Rails.env.production?
puts "!!!WARNING!!! This task will DESTROY " +
"your production database and RESET all " +
"application settings"
puts "Continue? y/n"
continue = STDIN.gets.chomp
unless continue == 'y'
puts "Exiting..."
exit!
end
end
end
Я создал этот смысл для некоторого контекста.
Для второй части вопроса - обычно вам действительно нужны две вещи: a) очень просто посеять базу данных и настроить приложение для разработки и b) загрузочное приложение на производственном сервере (например: вставка пользователя admin, создание приложений для папок зависит от и т.д.).
Я бы использовал приспособления для посева в разработке - все из команды затем видят одни и те же данные в приложении и что в приложении соответствует тому, что в тестах. (Обычно я переношу rake app:bootstrap
, rake app:seed
rake gems:install
и т.д. В rake app:install
, чтобы каждый мог работать с этим приложением, просто клонируя репо и выполняя эту одну задачу.)
Я бы никогда не использовал светильники для посева/загрузки на производственном сервере. Rails 'db/seed.rb
отлично подходит для этой задачи, но вы можете, конечно, поместить ту же логику в свою собственную задачу rake app:seed
, как указывали другие.
Ответ 3
Rails 3 решит это для вас, используя файл seed.rb.
http://github.com/brynary/rails/commit/4932f7b38f72104819022abca0c952ba6f9888cb
Ответ 4
Мы создали кучу лучших практик, которые мы используем для обработки данных. Мы сильно полагаемся на посев, и у нас есть некоторые уникальные требования, так как нам нужно посеять многопользовательские системы. Вот несколько лучших практик, которые мы использовали:
- Светильники - не лучшее решение, но вы все равно должны хранить ваши данные семян в чем-то, кроме Ruby. Код Ruby для хранения данных семян имеет тенденцию к повторению, а хранение данных в синтаксическом файле означает, что вы можете написать общий код для последовательного обработки ваших семян.
- Если вы собираетесь обновлять семена, используйте столбец маркера с именем
code
, чтобы сопоставить ваш файл семян с вашими фактическими данными. Никогда не полагайтесь на соответствие между средами между средами.
- Подумайте о том, как вы хотите обработать обновление существующих данных семян. Есть ли потенциал, который пользователи модифицировали? Если это так, следует ли сохранять информацию пользователя, а не переопределять его с помощью данных семени?
Если вы заинтересованы в некоторых способах посева, мы упаковали их в драгоценный камень под названием SeedOMatic.
Ответ 5
Как просто удалить задачу с рабочего сервера после того, как вы заселили базу данных?
Ответ 6
У меня просто была интересная идея...
что делать, если вы создали\db\seed\и добавили файлы стиля миграции:
file: 200907301234_add_us_states.rb
class AddUsStates < ActiveRecord::Seeds
def up
add_to(:states, [
{:name => 'Wisconsin', :abbreviation => 'WI', :flower => 'someflower'},
{:name => 'Louisiana', :abbreviation => 'LA', :flower => 'cypress tree'}
]
end
end
def down
remove_from(:states).based_on(:name).with_values('Wisconsin', 'Louisiana', ...)
end
end
попеременно:
def up
State.create!( :name => ... )
end
Это позволит вам запускать миграции и семена в порядке, позволяющем им сосуществовать более мирно.
мысли?