web-dev-qa-db-fra.com

Meilleur moyen d’exporter une table de base de données dans un fichier YAML?

J'ai des données dans ma base de données de développement que j'aimerais utiliser comme éléments fixes dans mon environnement de test. Quel est le meilleur moyen dans Rails 2.x d’exporter une table de base de données vers un appareil YAML?

31
Mattew

Il y a une tâche de rake pour cela. Vous pouvez spécifier Rails_ENV si nécessaire. la valeur par défaut est l'environnement de développement:

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

J'utilise YamlDb pour enregistrer l'état de ma base de données.

Installez-le avec la commande suivante:

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

Utilisez la tâche rake pour vider le contenu de la base de données Rails vers db/data.yml

rake db:data:dump

Utilisez la tâche rake pour charger le contenu de db/data.yml dans la base de données.

rake db:data:load

Ceci est la page d'accueil des créateurs:

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

21
Geekygecko

Ce plugin va ajouter la fonctionnalité que vous voulez. Il a été extrait d’ActiveRecord et ne vient donc plus par défaut.

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

Puis lancez:

rake db:fixtures:dump MODEL=ModelName

9
Brian Armstrong

Pour Rails 3, si vous voulez vider yaml de la base de données et l’utiliser en tant que fixture, j’utilise le code suivant:

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

Je viens de le lancer depuis la console avec 

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

Je n'ai pas réussi à faire fonctionner ar_fixtures avec Rails 3 (je n'ai pas vraiment essayé). Yaml db est idéal pour la sauvegarde et l’enregistrement de la base de données, mais son format n’est pas compatible avec les appareils.

6
jpgeek

Iron Fixture Extractor a été construit dans ce but précis. Cela convient particulièrement aux situations dans lesquelles vous souhaitez utiliser différents ensembles de montages pour différents scénarios de test (plutôt que d'avoir tous les montages pour tous les tests). Il fournit des fonctionnalités pour extraire, charger, reconstruire des fixtures, tronquer des tables ou capturer des hachages particuliers de vos fichiers yaml de fixture.

4
Joe Goggins

Une gemme très simple créera des fixtures Yaml à partir d'une base de données existante ...

github.com/vanboom/yaml_dump

Fonctionne avec Rails 4.

2
vanboom

rake db:fixtures:dump 

a été changé en 

rake db:extract_fixtures

2
Zoli

Voici une tâche de rake qui fera exactement cela (testé dans 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

Source: http://sachachua.com/blog/2011/05/Rails-exporting-data-specific-tables-fixtures/

Remarque: j'ai dû apporter quelques modifications au code du blog pour le rendre plus compatible avec les bases de données croisées et fonctionner dans Rails 3.2.

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

puis copiez-le et collez-le dans un fichier et modifiez-le pour l'adapter à vos attentes.

C'est du travail manuel, mais si vous en avez besoin une seule fois, c'est probablement le moyen le plus rapide.

1
Tom Maeckelberghe

Pour le vidage des appareils de test rspec/concombre dans Rails 3, voici la meilleure réponse que j'ai trouvée: Quelle est la méthode standard pour vider les appareils db en yml dans des rails?

0
Hari Karam Singh