Подтвердить что ты не робот

Лучший способ экспортировать таблицу базы данных в файл YAML?

У меня есть некоторые данные в моей базе данных разработки, которые я хотел бы использовать в качестве инструментов в своей тестовой среде. Как лучше всего в Rails 2.x экспортировать таблицу базы данных в устройство YAML?

4b9b3361

Ответ 1

Для этого есть задача rake. При необходимости вы можете указать RAILS_ENV; по умолчанию используется среда разработки:

rake db:fixtures:dump
    # Create YAML test fixtures from data in an existing database.

Ответ 2

Я использовал YamlDb для сохранения состояния моей базы данных.

Установите его с помощью следующей команды:

script/plugin install git://github.com/adamwiggins/yaml_db.git 

Используйте задачу rake для сброса содержимого базы данных Rails в db/data.yml

rake db:data:dump

Используйте команду rake для загрузки содержимого db/data.yml в базу данных

rake db:data:load

Это страница создателей:

http://blog.heroku.com/archives/2007/11/23/yamldb_for_databaseindependent_data_dumps/

Ответ 3

Этот плагин добавит нужные функции. Он был извлечен из ActiveRecord, поэтому по умолчанию не поступает.

script/plugin install http://github.com/topfunky/ar_fixtures

Затем запустите:

rake db:fixtures:dump MODEL=ModelName

Ответ 4

Для Rails 3, если вы хотите сбросить yaml из БД и использовать его как инструмент, я использую этот код:

module DbToFixture

  TEMP_FIXTURE_PATH = Rails.root.join("test", "new_fixtures")

  def fixturize(model)
    Dir.mkdir(TEMP_FIXTURE_PATH) unless File.exists?(TEMP_FIXTURE_PATH)
    fname = model.table_name
    file_path = TEMP_FIXTURE_PATH.join(fname)
    File.open(file_path, 'w') do |f|
      model.all.each do |m|
        f.write(m.to_yaml)
      end
    end
  end

end

Я просто запускаю его с консоли с помощью

require './lib/db_to_fixture'
include DbToFixture
fixturize ModelName

Мне не удалось заставить ar_fixtures работать с Rails 3 (хотя и не очень старался). Yaml db отлично подходит для демпинга и сохранения db, но его формат не совместим с приборами.

Ответ 5

Iron Extractor был построен именно для этой цели. Это особенно полезно для ситуаций, когда вы хотите использовать разные наборы приборов для разных сценариев тестирования (вместо того, чтобы иметь все приспособления для всех тестов). Он предоставляет функциональные возможности для извлечения, загрузки, перестройки светильников, усечения таблиц или захвата определенных хэшей из ваших файлов yaml вашего прибора.

Ответ 6

rake db:fixtures:dump

был изменен на

rake db:extract_fixtures

Ответ 7

Очень простой камень создаст ярлыки из существующей базы данных...

github.com/vanboom/yaml_dump

Работает с Rails 4.

Ответ 8

Здесь задание грабли, которое будет делать именно это (проверено в Rails 3.2.8):

namespace :db do
    task :extract_fixtures => :environment do
      sql  = 'SELECT * FROM "%s"'
      skip_tables = ["schema_migrations"]
      ActiveRecord::Base.establish_connection
      if (not ENV['TABLES'])
        tables = ActiveRecord::Base.connection.tables - skip_tables
      else
        tables = ENV['TABLES'].split(/, */)
      end
      if (not ENV['OUTPUT_DIR'])
        output_dir="#{Rails.root}/test/fixtures"
      else
        output_dir = ENV['OUTPUT_DIR'].sub(/\/$/, '')
      end
      (tables).each do |table_name|
        i = "000"
        File.open("#{output_dir}/#{table_name}.yml", 'w') do |file|
          data = ActiveRecord::Base.connection.select_all(sql % table_name.upcase)
          file.write data.inject({}) { |hash, record|
            hash["#{table_name}_#{i.succ!}"] = record
            hash
          }.to_yaml
          puts "wrote #{table_name} to #{output_dir}/"
        end
      end
    end
end

Источник: http://sachachua.com/blog/2011/05/rails-exporting-data-specific-tables-fixtures/

Примечание. Мне пришлось внести несколько изменений в код блога, чтобы сделать его более совместимым с кросс-базами и работать в Rails 3.2

Ответ 10

 > rails c
 irb> puts Modelname.all.to_yaml

затем скопируйте и вставьте его в файл и отредактируйте его в соответствии с ожидаемыми условиями.

Это ручной труд, но если вам это нужно всего лишь один раз, это самый быстрый способ.