2011-10-07 32 views
65

Tendrá que admitir, para un novato en rieles y bases de datos, que la explicación oficial en rubyonrails.org hace que las cuatro tareas suenen exactamente igual. Cita:¿Cuál es la diferencia entre db: test: clone, db: test: clone_structure, db: test: load y db: test: prepare?

rake db:test:clone Recreate the test database from 
        the current environment’s database schema 

rake db:test:clone_structure Recreate the test database from the 
           development structure 

rake db:test:load Recreate the test database from the current schema.rb 

rake db:test:prepare Check for pending migrations and load the test schema 

Ni siquiera sé la diferencia entre la estructura y el esquema. ¿Y cuál es la diferencia entre cargar el esquema del entorno actual y simplemente cargar schema.rb?

¿Qué tan similares (o diferentes) son estas tareas?

Respuesta

61

Muy buena pregunta. Me dejó perplejo así que me zambullí en la fuente de los rieles y detuve database.rake. Ahora es más claro:

db:test:clone es sólo una combinación de db:schema:dump y db:test:load:

task :clone => %w(db:schema:dump db:test:load) 

db:test:clone_structure utiliza el archivo {} RAILS_ENV _structure.sql:

task :clone_structure => [ 'db:structure:dump', 'db:test:purge' ] do 
    # skipped some code, here's what happens for MySQL: 
    ActiveRecord::Base.establish_connection(:test) 
    # ... 
    IO.readlines("#{Rails.root}/db/#{Rails.env}_structure.sql").join.split("\n\n").each do |table| 
    ActiveRecord::Base.connection.execute(table) 
    end 
end 

db:test:load es lo mismo que db:schema:load , pero lo invoca en la base de datos de prueba:

task :load => 'db:test:purge' do 
    ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test']) 
    # ... 
    db_namespace['schema:load'].invoke 
end 

db:test:prepare le avisa si hay alguna migración pendiente, y si no, ejecuta db:test:clone_structure (usando el archivo {rails_env} _structure.sql) o db:test:load (usando el archivo schema.rb), dependiendo del formato del esquema (esto es poco confuso para mí, tal vez alguien más puede ampliarlo):

task :prepare => 'db:abort_if_pending_migrations' do 
    # ... 
    db_namespace[{ :sql => 'test:clone_structure', :ruby => 'test:load' }[ActiveRecord::Base.schema_format]].invoke 
end 

Hope this lo aclara! Una vez más, revisar el archivo database.rake es fácil y aclarará cualquier otra pregunta que pueda tener. Ese enlace va a la línea que es el comienzo del espacio de nombres de prueba.

+0

En pocas palabras: Todos son prácticamente lo mismo. :-p – bricker

+0

advertencia - Encontré que db: test: clon no copió correctamente la nulabilidad de las columnas de mi base de datos de desarrollo. Esto puede ser un error antiguo que posteriormente se ha solucionado, ya que lo encontré usando Rails 2.3.12. –

20

En realidad no son exactamente lo mismo. Cualquiera de las tareas que contienen la palabra 'esquema' actúa en el archivo .../db/schema.rb. schema.rb es efectivamente el estado de su esquema después de aplicar todas las migraciones. Se puede ejecutar para restaurar su esquema en lugar de ejecutar todas las migraciones de base de datos (lo que puede llevar mucho tiempo si tiene muchas migraciones).

Cualquiera de las tareas con la palabra 'estructura', actúa en el archivo {Rails.env} _structure.sql. Este archivo se usa cuando el esquema contiene construcciones que no se pueden expresar en el archivo schema.rb. Por ejemplo, si usa características específicas de un RDBMS particular. Debajo de las carátulas, los rieles producen este archivo usando la utilidad de volcado de esquema adecuada para su RDBMS. Para restaurar el esquema, lee el archivo y ejecuta las declaraciones de SQL en contra usando una herramienta específica de RDBMS.

rieles sabe si seguir la ruta schema.rb o la ruta structure.sql en función de si o no que haya establecido

config.active_record.schema_format =: sql

en su ... /config/application.rb

+1

Excelente expansión en la respuesta de Bricker, ¡gracias! –

+0

ejemplos de cosas que pueden diferir: desencadenantes, funciones y procedimientos almacenados. (que es por lo que todavía estamos atascados con la estructura). –

Cuestiones relacionadas