web-dev-qa-db-ja.com

データベーステーブルをYAMLファイルにエクスポートする最良の方法は?

開発データベースに、テスト環境のフィクスチャとして利用したいデータがいくつかあります。 Rails 2.xでデータベーステーブルをYAMLフィクスチャにエクスポートするための最良の方法は何ですか?

31
Mattew

これにはレーキタスクがあります。必要に応じてRails_ENVを指定できます。デフォルトは開発環境です。

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

私は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/

21
Geekygecko

このプラグインはあなたが望む機能を追加します。 ActiveRecordから抽出されたため、デフォルトでは提供されなくなりました。

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

次に、以下を実行します。

rake db:fixtures:dump MODEL=ModelName

9
Brian Armstrong

Rails 3の場合、DBから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で動作させることができませんでした(ただし、あまり努力していません)。Yamldbは、dbのダンプと保存に最適ですが、その形式はと互換性がありません。フィクスチャ。

6
jpgeek

Iron Fixture Extractor まさにこの目的のために作られました。これは、(すべてのテストにすべてのフィクスチャを用意するのではなく)さまざまなテストシナリオにさまざまなフィクスチャセットを使用する場合に特に適しています。フィクスチャのyamlファイルからフィクスチャを抽出、ロード、再構築、テーブルを切り捨てたり、特定のハッシュを取得したりするための機能を提供します。

4
Joe Goggins

非常に単純なgemは、既存のデータベースからyamlフィクスチャを作成します...

github.com/vanboom/yaml_dump

Rails 4で動作します。

2
vanboom

rake db:fixtures:dump

に変更されました

rake db:extract_fixtures

2
Zoli

これはまさにそれを実行するrakeタスクです(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

1
Pierre
 > Rails c
 irb> puts Modelname.all.to_yaml

次に、それをコピーしてファイルに貼り付け、フィクスチャが期待するものと一致するように編集します。

肉体労働ですが、これが必要な場合は、おそらく1回だけ最速の方法です。

1

Rails 3のrspec/cucumberテストフィクスチャのダンプについては、これが私が見つけた最良の答えです: レールのymlフィクスチャにdbをダンプする標準的な方法は何ですか? ==

0