ruby on rails - multi - ¿La mejor manera de exportar una tabla de base de datos a un archivo YAML?
rails translation interpolation (10)
Tengo algunos datos en mi base de datos de desarrollo que me gustaría utilizar como accesorios en mi entorno de prueba. ¿Cuál es la mejor manera en Rails 2.x de exportar una tabla de base de datos a un dispositivo YAML?
He estado usando YamlDb para guardar el estado de mi base de datos.
Instálelo con el siguiente comando:
script/plugin install git://github.com/adamwiggins/yaml_db.git
Utilice la tarea de rake para volcar el contenido de la base de datos Rails a db / data.yml
rake db:data:dump
Utilice la tarea de rake para cargar los contenidos de db / data.yml en la base de datos
rake db:data:load
Esta es la página de inicio de los creadores:
http://blog.heroku.com/archives/2007/11/23/yamldb_for_databaseindependent_data_dumps/
Hay una tarea de rake para esto. Puede especificar RAILS_ENV si es necesario; el valor predeterminado es el entorno de desarrollo:
rake db:fixtures:dump
# Create YAML test fixtures from data in an existing database.
rake db:fixtures:dump
ha sido cambiado a
rake db:extract_fixtures
Este complemento agregará la funcionalidad que desee. Fue extraído de ActiveRecord por lo que ya no viene por defecto.
script/plugin install http://github.com/topfunky/ar_fixtures
Entonces corre:
rake db:fixtures:dump MODEL=ModelName
Para Rails 3, si desea volcar yaml desde el DB y usarlo como accesorio, utilizo este código:
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
Simplemente lo ejecuto desde la consola con
require ''./lib/db_to_fixture''
include DbToFixture
fixturize ModelName
No he podido obtener ar_fixtures para que funcione con Rails 3 (sin embargo, no lo he intentado mucho). Yaml db es ideal para descargar y guardar el archivo db, pero su formato no es compatible con accesorios.
Aquí hay una tarea de rake que hará exactamente eso (probado en 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
Fuente: http://sachachua.com/blog/2011/05/rails-exporting-data-specific-tables-fixtures/
Nota: tuve que hacer algunos cambios en el código del blog para que sea más compatible con las bases de datos cruzadas y funcione en Rails 3.2
Iron Fixture Extractor fue construido para este propósito. Es particularmente bueno para situaciones en las que desea utilizar conjuntos de dispositivos diferentes para diferentes escenarios de prueba (en lugar de tener todos los accesorios para todas las pruebas). Proporciona funcionalidad para extraer, cargar, reconstruir accesorios, truncar tablas o enganchar hashes concretos de los archivos yaml de su dispositivo.
> rails c
irb> puts Modelname.all.to_yaml
luego copie y pegue en el archivo y edítelo para que coincida con lo que esperan los accesorios.
Es trabajo manual, pero si lo necesitas solo una vez, probablemente sea la manera más rápida.
Una gema muy simple creará accesorios yaml de la base de datos existente ...
Funciona con Rails 4.
Para el vertido de accesorios de prueba rspec / pepino en Rails 3, esta es la mejor respuesta que he encontrado: ¿Cuál es la forma estándar de volcar db a yml en rieles?