Каков стандартный способ выгрузки дБ в yml светильников в рельсах? - PullRequest
19 голосов
/ 25 августа 2009

Я видел некоторые плагины и пользовательские грабли, чтобы сбросить активную базу данных в фикстуры, но я не уверен, какая техника преобладает.

По сути, я хочу получить противоположность rake: db: fixtures: load, чтобы я мог поместить основную информацию о БД (например, учетную запись администратора) в svn, когда мы развернемся. Я не хочу создавать приборы вручную для таких вещей, как примеры данных, которые занимают много времени.

Когда мы развернем, я хочу иметь возможность просто запустить

rake db:migrate
rake db:fixtures:load

И отправляйся на скачки.

Каков наилучший / предпочтительный метод для этого в рельсах?

EDIT:

Так что, похоже, не существует стандартного способа выполнить противоположное задание по рейку в db: fixtures: load.

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

rake db:data:dump
rake db:data:load

Данные попадут в файл YAML без нарушения тестовых данных (которые могут быть другими, теперь, когда я подумаю об этом более тщательно). Кроме того, если его использует такой распространенный инструмент, как Heroku, мне не нужно беспокоиться о проблемах с поддержкой / долговечностью.

Полагаю, это наиболее близко к "стандартному", который я найду.

Спасибо за все замечательные ответы.

Ответы [ 6 ]

14 голосов
/ 30 августа 2012

Звучит так, будто вы должны использовать db / seed.rb и связанную с ним задачу rake db: seed. Они разработаны специально для загрузки начальных данных. Затем вы можете звонить на YamlDB загрузить данные и получить данные из rake db: data: dump_dir, чтобы выгрузить все приборы во временный каталог и при необходимости скопировать их в каталог исходных данных.

Обратите внимание, что это НЕ работает для сброса приборов, так как формат YAML отличается. Замеченные выше ar_fixtures не работают с Rails 3 и, похоже, больше не поддерживаются. Для создания дампов вы можете попробовать что-то вроде этого в 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.

11 голосов
/ 25 августа 2009

Heroku использует Gem YamlDB

http://www.github.com/ludicast/yaml_db/tree/master

2 голосов
/ 25 августа 2009

нет Стандартного способа сделать это. Только стандартный способ загрузки светильников:

rake db:fixtures:load

Но в Интернете есть множество примеров:

1 голос
/ 24 января 2014

Для тех, кто только что нашел это сейчас, я немного изменил ответ от @jpgeek. Включите таблицу schema_migration в список игнорирования и упорядочите по идентификатору, чтобы я получил вывод table_name_001 для 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
1 голос
/ 25 августа 2009

Я думаю, что если это стандартная административная информация, то вам лучше было бы включить ее в миграцию. светильники в идеале должны использоваться только для тестирования.

1 голос
/ 25 августа 2009

Он не использует тот же формат, что и db: fixtures: ожидаемая загрузка, но ar_fixtures значительно упрощает выгрузку и загрузку данных в виде файлов YAML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...